perm filename LISP.RPG[S,DOC]13 blob
sn#684692 filedate 1982-09-09 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00345 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00023 00002 Table of Contents
C00027 00003
C00031 00004
C00037 00005
C00039 00006 Part 1 - The Language
C00043 00007 Maclisp Reference Manual
C00046 00008 General Information
C00050 00009 Maclisp Reference Manual
C00053 00010 General Information
C00056 00011 Maclisp Reference Manual
C00057 00012 Data Objects
C00061 00013 Maclisp Reference Manual
C00066 00014 Data Objects
C00071 00015 Maclisp Reference Manual
C00074 00016 Data Objects
C00076 00017 Maclisp Reference Manual
C00077 00018 The Basic Actions of LISP
C00081 00019 Maclisp Reference Manual
C00084 00020 The Basic Actions of LISP
C00089 00021 Maclisp Reference Manual
C00092 00022 The Basic Actions of LISP
C00096 00023 Maclisp Reference Manual
C00100 00024 The Basic Actions of LISP
C00104 00025 Maclisp Reference Manual
C00107 00026 The Basic Actions of LISP
C00111 00027 Maclisp Reference Manual
C00114 00028 The Basic Actions of LISP
C00116 00029 Maclisp Reference Manual
C00119 00030 Part 2 - Function Descriptions
C00122 00031 Maclisp Reference Manual
C00125 00032 Predicates
C00128 00033 Maclisp Reference Manual
C00131 00034 Predicates
C00132 00035 Maclisp Reference Manual
C00133 00036 The Evaluator
C00136 00037 Maclisp Reference Manual
C00139 00038 The Evaluator
C00142 00039 Maclisp Reference Manual
C00145 00040 The Evaluator
C00149 00041 Maclisp Reference Manual
C00152 00042 The Evaluator
C00155 00043 Maclisp Reference Manual
C00157 00044 Manipulating List Structure
C00160 00045 Maclisp Reference Manual
C00163 00046 Manipulating List Structure
C00164 00047 Maclisp Reference Manual
C00166 00048 Manipulating List Structure
C00168 00049 Maclisp Reference Manual
C00171 00050 Manipulating List Structure
C00174 00051 Maclisp Reference Manual
C00175 00052 Manipulating List Structure
C00177 00053 Maclisp Reference Manual
C00181 00054 Manipulating List Structure
C00185 00055 Maclisp Reference Manual
C00187 00056 Manipulating List Structure
C00190 00057 Maclisp Reference Manual
C00193 00058 Manipulating List Structure
C00196 00059 Maclisp Reference Manual
C00198 00060 Manipulating List Structure
C00202 00061 Maclisp Reference Manual
C00204 00062 Manipulating List Structure
C00208 00063 Maclisp Reference Manual
C00211 00064 Flow of Control
C00215 00065 Maclisp Reference Manual
C00218 00066 Flow of Control
C00221 00067 Maclisp Reference Manual
C00225 00068 Flow of Control
C00228 00069 Maclisp Reference Manual
C00233 00070 Flow of Control
C00236 00071 Maclisp Reference Manual
C00239 00072 Flow of Contrcl
C00241 00073 Maclisp Reference Manual
C00244 00074 Flow of Control
C00245 00075 Maclisp Reference Manual
C00249 00076 Flow of Control
C00252 00077 Maclisp Reference Manual
αC00253 0007`∩∩∩∩%βi←[%FA's5E←Yf4∃ε``Hjn@`@`nr∩$∩∩@@↓≠CGY%c`A%∃MKeK9GJA≠¬]kCX4∃ε``Hjr@`@`p`∩$∩∩∪βQ←[SF↓'s[E=Yf~∃``dl@@``βAD$∧HI↓↓αn∂3'∨↓αK↔4+K↔;≡)α7πw+π04T→AAI3!↓AAβAH$$HH&πS}k'
α∨K7?g_4*
β↓IY]β↓AAa_H$$%α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4*
β↓I]Aβ↓AAa H$$$LS?7N→αOGn∪?3LhR
AA∪9I↓Aβ↓aT$HH%↓↓∧kπ∂3O≠AαK.3↔K↔v≠∃α7∞sWπ0hR
AA∪9U↓Aβ↓aX$HH$&π&{7'
¬≠g7}cL4*≠↓AI]:↓AAAC8$$$J↓↓α7∞≠3'OααK↔≠/∪↔;∂*α7π;.04*≠↓AIa
↓AAAC@$$$HJπS?nK
αONk?3_h*
Aβ⊃aU↓β↓AadHH$%↓αα7π∂fKOAα⊗+≠↔K.s∂∃αn;Wπ`h*
Aβ⊃aY↓β↓Ae@HH$$&∂#?7'~αOg7⊗{3L4T→AAICI↓AAβID$$HI↓↓αn∂3'∨↓αK↔6+K↔;≡)α7πw+π04T→AAIK⊃↓AAβIH$$HH&πS}k'
α∨K7?g_4*
β↓IeQβ↓AAe_H$$%α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4*
β↓IeUβ↓AAe H$$$J↓↓↓αw+7↔↔_4*
β↓Ie]β↓AAe(H$$%α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4*
β↓Ieeβ↓AAe0H$$$J↓↓↓αw+7↔↔_4*
β↓MAEβ↓AAe8H$$%α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4*
β↓MAMβ↓AAe@H$$$J↓↓↓αw+7↔↔_4*
β↓MAUβ↓AAeHH$$%α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4*
β↓MA]β↓AEAH$$$J↓↓↓αw+7↔↔_4*
β↓MEAβ↓AEAλH$$%α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4*
β↓MEMβ↓AEA⊂H$$$J↓↓↓αw+7↔↔_4*
β↓MEQβ↓AEA_H$$%α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4*
β↓ME]β↓AEA H$$$J↓↓↓αw+7↔↔_4*
β↓MIAβ↓AEA(@$$%α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4*
β↓MIEβ↓AEA0H$$$J↓↓↓αw+7↔↔_4*
β↓MIQβ↓AEA8H$$%α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4*β↓MIYβ↓AEA@H$$$J↓↓↓αw+7↔↔_4*
β↓MIaβ↓AEAH@$$¬α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4*
β↓MIeβ↓AEEH$$$J↓↓↓αw+7↔↔_4*
β↓MMIβ↓AEEλH$$¬α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4*β↓MMQβ↓AEE⊂H$$∧J↓↓↓αw+7↔↔_4*
β↓MM]β↓AEE_H$$%α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4*
β↓MMeβ↓AEE H$$¬α↓↓α∂FKπ∂&+Iα7∞s'CWfS'?ph*
Aβ→QE↓β↓EETHH$%↓αα7π∂fKOAα⊗+≠↔K.s∂∃αn;Wπ`h*
Aβ→QQ↓β↓EEXHH$%↓α↓α∂#∂∪π∂S/⊃α7πvKCW∪∂#'?8hR
AA≠!]↓Aβ EL$HH%↓↓∧kπ∂3O≠AαK.3↔K↔v≠∃α7∞sWπ0hR
AA≠!a↓Aβ E@$HH%↓↓αα∂βπ⊗∂S↔∩α7π;Hεπ.f≡M⊗}pQ(3ββ6V∩ββε⊂'⊃ ""$∧λ∪8,=~<|∧
Y9P∩\2w1bH&pw:XvεE!L_→BYH__⊂@20 Arrays
C00357 0012⊃ ↓ Eaclisp Reference Manual
αC00362``bdβ⊂$$∧HI↓↓↓∧KKπM_4*β↓MY]β↓AEI_H$$∧α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4
αεβ≠≠∧εββ&A⊂HHα"(∧∧λ⊂<N>8c!(lλfvhε⊗M""↓⊃(λλ \8{~.x⊂)2Y2y2g_pP&p[:pvεB!X⊂→M[⊂⊂_Y≠∧DαD@ Arrays
A00380 0127 MacliSp ReFerence @≠↓∞sWπ⊂hR≠βε7β
α∧&'α""!∀λλλ∧∧λ∪8.∞~;Ydλ]3XnM9{TaQP`λ_X~P__Y≤DBD@ MacLisp Re`
Ke∃]GJA5C]kC0~¬εβ↓Maaβ↓AEM@⊂HHα(λ∧∧λλλ \<≤⊂∀[3P#*[1z4g[9FE!L_⊃@→1 00"β→D∧⊃⊃ααα \⊗≡f≡:α¬⊗\h .2p∞c↓⊂A≠C]UCX~∃``f↓K⊃↓A@ε⊂f! ""∧∧λλλ∧
_0 :λ→P⊗@ The SysteM
C`@frh@@`bf_@⊂Hλα ⊂⊂λ&pqf~yx⊂)→pεerence Manual
∃ε↓β↓Me]β↓AEMαA⊂HHα"(∧
~→(
?<⎇→-Q ¬!X~_1``BfT∩αα∩@Aβ
YSg`↓%KMJIK]GJ↓≠CMk¬X∩*≠↓AQ@~↓AA¬≠0$$∧HI↓αSF)αOG∨#↔44T→AA⊃β9↓AAλε3(Hα""∧∧λ∪8,=~<|∧
Y9@∩\αenC∀A≠C]UCX~∃``H`d@``↓λε3@H⊃⊃Jα
Mε*¬?~7&.β#"HX_α01 Dfr$HH%↓↓∧kπ∂3M≠AαK,3↔K↔v≠∃αXλ;N\9β"HX_α14 0 140 ↓ The @&βKOS⊗hh ∀≠εC↓λλε⊗α⊂⊃ λ ↓ Macl@%`∂Aα⊗+⊂⊗/,Yf≡
\⊗w.≥AP@(lλ
ε&H__X∧" λ ∩↓)QJAMsgiK4~¬εβ↓QIYβ↓AEQ_H$$⊂λλ∧ 88p⊗~yx⊂)→q2y2[1rP&Xw:`vα@
C`@hd@$∧εββFA⊂Hλα"(∧
~→(
?<⎇→-Q ¬!X~→@2``Bhβ($∧⊃∀αα∧β08mM<|λ
,9Y →→u1rP∪pp∞uAlλ
*≠↓AQLε@λεελ-≠α@@ λ∧@A)Q∀A'@&ε:F.hβ"Pfε n∧ελ_@40ε$⊃⊃$∧λ∪8,=~0 xλ)2cep¬K@:_B∧n≥jV∞`Q(#βαF@Dελ_@48 ∩∩ λ%↓ααMε*∧?_nL8εFE⊂β0 hβ!@:α∧λ_
≤@ λ∧∩@@A5CGIRβ≠Aα,∧f/⊗]h6*∧β0⊂w≥pp
@ε`@↓ εS
α∧λ_MX∧DDα@ The @&πK@∨εX#!!P0450λ@β↓E@+⊃⊃!⊂∧P⊂⊂∪pqf(pπ`A⊗#⊂⊗.,XL≤αP&`[8¬al
λ¬ε@↓β!UEεεβ,B"B@ ∩↓ααS#∃¬≠gOS,¬Ph∀0εFLhεε- →D↓ ↓∩↓7 Maclisp Reference Manual
C00482 00158 The System
C00484 00159 Maclisp Reference Manual
C00488 00160 The System
C00492 00161 Maclisp Reference Manual
C00496 00162 The System
C00500 00163 Maclisp Reference Manual
C00504 00164 The System
C00507 00165 Maclisp Reference Manual
C00509 00166 The System
C00512 00167 Maclisp Reference Manual
C00516 00168 The System
C00519 00169 Maclisp Reference Manual
C00522 00170 The System
C00524 00171 Maclisp Reference Manual
C00527 00172 The System
C00530 00173 Maclisp Reference Manual
C00534 00174 The System
C00538 00175 Maclisp Reference Manual
C00543 00176 The System
C00548 00177 Maclisp Reference Manual
C00552 00178 The System
C00556 00179 Maclisp Reference Manual
C00561 00180 The System
C00565 00181 Maclisp Reference Manual
C00569 00182 The System
C00572 00183 Maclisp Reference Manual
C00577 00184 The System
C00582 00185 Maclisp Reference Manual
C00586 00186 The System
C00591 00187 Maclisp Reference Manual
C00595 00188 The System
C00597 00189 Maclisp Reference Manual
C00600 00190 The System
C00602 00191 Maclisp Reference Manual
C00606 00192 The System
C00610 00193 Maclisp Reference Manual
C00612 00194 The System
C00616 00195 Maclisp Reference Manual
C00621 00196 The System
C00625 00197 Maclisp Reference Manual
C00630 00198 The System
C00634 00199 Maclisp Reference Manual
C00635 00200 The System
C00639 00201 Maclisp Reference Manual
C00643 00202 The System
C00647 00203 Maclisp Reference Manual
C00650 00204 The System
C00654 00205 Maclisp Reference Manual
C00657 00206 The System
C00661 00207 Maclisp Reference Manual
C00665 00208 The System
C00670 00209 Maclisp Reference Manual
C00673 00210 The System
C00676 00211 Maclisp Reference Manual
C00681 00212 The System
C00685 00213 Maclisp Reference Manual
C00689 00214 The System
C00693 00215 Maclisp Reference Manual
C00697 00216 The System
C00701 00217 Maclisp Reference Manual
C00704 00218 The System
C00707 00219 Maclisp Reference Manual
C00711 00220 The System
C00715 00221 Maclisp Reference Manual
C00718 00222 The System
C00721 00223 Maclisp Reference Manual
C00725 00224 The System
C00729 00225 Maclisp Reference Manual
C00733 00226 The System
C00736 00227 Maclisp Reference Manual
C00739 00228 The System
C00743 00229 Maclisp Reference Eanual
C00745 00230 The System
C00750 00231 Maclisp Reference Manual
C00753 00232 The System
C00756 00233λ ↓ Maclisp Reference Manual
C 0751 00234 The System
αC0076200235 Maclisp Reference Manual
∃ε@`nll``dfX∩∩∩∩$@A)Q∀A'sgQKZ~∃``nl`@``∧Ln∩α∩%!Cehh@ZAQQJA→%' Aπ=[aSY∃`λ4
≠↓A]]∩↓AAI≠@$$∧J↓↓α7∞≠3'OααK↔≠/∪↔;∂*α7π;.04(6ββ;vdβββ&7⊂hT4εβ;C∧εββ∪F↓⊂HH∀∧α∧n≤=FO∨∧
&.6↑,Vv≡T V∞w\≥@h∀4εβ+C$εββ∪F⊃PT≠∧εsC:εεβ∪#!⊃⊂HJ∧∧∧n∞=M↔∂α
,V6/,Yf≡
\⊗w.≥APT≠∧εsK
∧εβ∪#1Q$≠βεs∪"βεε## ⊃⊃⊂Jα∧ V∞≡M≡7α¬,Xf/⊗]l6*∧β8;N\;β"H6
`≤NP_⊂→
~FE!L_≤__λ__"Ph∩∩∩$@@A≠¬GYSg@A%KMα+@⊗.l8R∧n≥nV∞`Q(3ββεε"ββ∧"C(H⊃⊃⊂J∧L\6f∂,≡FN}n1PT≠επββ2εεβ∪#↓⊃HJ∧∧∧n∞=I↔∨α
,V6/,]f≡* \⊗w.≥APT≠επβαεεβ∪#⊃⊃⊂HH∀λF.≡L≡&∂&≥⎇g_h(6ββC⊗4βββ&VHH⊃∀αα∧\≤6fO>∧¬⊗.lZ&.v<T∧n∞n\⊗`h(6ββC⊗pβββ&V⊂HH⊃⊃∩∧&\9F∂⊗≡M⊗}w1Q$≠βπα#
βεε#+⊂⊃⊃⊂Jα∧ V∞≡M≡7α¬,\f/⊗]l6*∧\≥g.∞AQ$≠βπα#∩βεε#+_⊃⊃⊂Jα
.Vvv≥lr∧≡⎇↑εNf\@λλn;Xu
≥{\c!(l∞ε&(ε&-α"!⊃(λλ \8{∩.x⊂)2Y2y2w_rP&p[:pvεB!X_≤≤⊂__~ZDDαDP⊂⊂λ⊂):`.nifg↓iQJA
←[aSαc↔HQ(3ββ∧6∩ββ∧"S0H⊃⊃∩αα \⊗≡f≡>α¬⊗\` .;Xq$ 8;],≥β"Pfε∞m∧εE&q ∧DDH⊂⊂⊂⊂∀:s74[3P:4→P!w`-pileR
C0838 00258 ↓ MacLisp Reference Manual
αC 0843 00259λ ∩@@A%U]US]≤AaQJ↓β←[a%QKd~)α``pβ!U↓Aαε#&α""!∀λλ∪,≤{~4n∧∀Y1L↑Y;XlT⊂ε`w≥prεE⊂X_∀40∧@`@Hhb$HH&S#*α3'OααπOO,¬V⊗g∀
πε↑|,⊗jB H∃hαPlεπ
(λεεMLA⊃ ∧DPλ⊂"pq[4yx⊂∀2s2i→w1rP∪pw:p[∧@
C0085$``DlL∩∩∩∪QQJA→%`∂Aα∂≠G↔\-GJ¬∞-v/⊗≥QB∧d~↓PD≠επβ+Jεβ∪3A⊃⊂HJ∧∧∧n∞=I↔∂α
,V&/,]f≡* \⊗w.≥APD≠∧πβ#∩ε&M""↓⊃5~→$ ~<t∧λ<|q-\Y~(
∞Yy|L≥+λ∪λ~β"Pfε∞
MDεEFa ""$∧λ∪8,=~<|∧
Y9P∩\αenc↓∀A≠C]UCX~∃``pN@@``⊃1\$⊃⊃∃&FT FO∨∧λ↔∂≡]\&gJλM||X;%D⊃⊂ (βE!@⊂0874 0026 0$∩∩$α↓α7π≤c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4
αεβC;tεββ∪e⊃!⊂ ∧j4→P"4`3p Ac@MK[EYβIαCK|;@⊗∞β+λ H4β"HX_∧80 0 Hh
@$HH%↓↓∧kπ∂3Lε7α¬,X L↑Y;XlT⊂ε`w≥prεE⊂β00(`f@`↓β⊃@≠λα""↓~~→( M<|λλ≡|q0⊗X68@(≤0πg@e¬ZP⊃αd
@$(6ββC∧pβββ&pA⊂ ∧DPλ⊂
aclisp RefeIKUGJ↓≠CMk¬X⊂∀(6ββC⊗∧βββ&pa⊃ ∧Dj~2P& (pπ`AβMcK@7⊗ceαβ⊗{⊂∨⊗≥P∧ ⊂4β!λlλλ≤∞X⊂⊂_≠R∧Dα@P⊂⊂∪pqv )pπ`A%⊃H↔K,s∂¬αn;Gπ`h"
AβAeM↓β↓I]TH@$&SF)α3'∨↓απO≤+7∪JαCK∨?∪π51∧bε@4T→AAeβ↓↓A@ε
@Mα ∩∩ ↓↓αn∂3'≥↓αK↔0∧W,9P`∩H&pw:XvεE!L_≤X→H__∩Xh$⊃⊃∃&FT FO∨∧λ↔∂≡]\&gJλM||X;%D⊃⊂ (βE!@00907 00278 ↓∩A≠CGαc'OA¬∪↔6↑,Vv≡T V∞w\≥@h∀0π⊗∞(εεMn"!⊂(λ⊂l≥≠~3LT⊂≤[l@y0viH+y4`4p KL@αK9α|Mε/∩ H⊗v?\≤v/_Q(3ββ⊗⊗2ββ∧@≤∧@DDλ⊂⊂&pXv4qxλ)2s %p¬KMεε)α7πw+π04T→AAeA↓A@ε ∞ε⊂ ∧DPλ!pv ,ing Pp`∂O⊗7Mα?∪'SS,qβ'→∧{S#↔⊂∧∧f∞βP∪zXqryFB!X⊂922 `@dpd∩ λ$%↓αα7π∂dK@∨α
,V&/,Yf≡
\⊗w∞≥APT≠∧∞&&(λε'b"!∀λ⊂p-M~;Yd
≤[qn8εyP∃βr`∪IQK\ARαqα?SF+Aα∪∞s∨Wπ>+D4
≠↓AeI8↓AA A $$⊃∀αα∧β88mM<|λ
,9Y →→w1rP∪ps:p[∧¬∃ε@`rfBα↓AAI@εPHHα ⊂⊂⊂ppl%]NAI←GeC5bA↑α-↔'→3@⊂~w⊂'`4her LangeAdπC@LhR≠βε,fDGε@∧DDαP⊂⊂&Xqr4`3p Re@→KeK]
JA6∧≥g.∞AQ$6λλYLβ β⊃a\$HI↓α∂∞c#'hpλ
∞Xπsy_vyP+\αit`)∃\AS\αα ?&PD _;Yn\9y0→CE!@0090λb↓β↓AI↓∞α↓⊂∧@ @A≠CGαc'OA¬∪↔6\,Vv≡T V∞wX≥@@P¬!@0090λH↓β↓AI↓∞"B@@ @@A6∞≠#'OααK↔≠(∞&.V8T∧n∞β]0-A ∧DPλ⊂⊂⊂⊂λ¬∃ε@`rhnα↓AA↓'∩Hλα""B@@ λ∧@@@@@@~∃λ``rj@@`@@ε ∞&⊂∧@ λ∧@@@A5CGISβ≠Aα,∧f/⊗Yh6*∧β0⊂w≤pp λ∧∩@@@@@@~)
Aπ∩S$_→∞Y λ∧∩$⊃⊃!⊂∧P⊂⊂λ⊂⊂⊂εBαC ↓βI@∪αε',b"B@ Mac1Sg`AIK@≠↔⊗+;∂∃∧kπ+⊗∞`$Hα ⊂⊂λ⊂⊂⊂⊂α¬∃ε↓β↓e@3Dεββ∩ε-α↓⊂∧@ λ∧∩$⊃∀ααα∧∧α ¬!X≤[⊂↔``@II($Hα" ∧∧λ∪8,≥~0 hλ)2`&↓⊃`↔h0→H&pw*Xv∧DD↓
B0097∩ 0 dβIP⊂Hα""↓⊂∧@ λ
@ε`@↓K1U↓εε#K`""BP⊂⊂⊂∪pqf(pπ`A⊗ ⊗ ,8Y0↔_p¬ MAnqalλ∧∩%↓α↓↓↓↓h ∀~∞&@\⊂⊂029 ⊂∩ λ$Hα""↓⊂∧@ @@@@@∩*εεβKα⊂εββ∩ε."B@@ @@A6∞≠#'OααK↔~(∞&.@Xy( \8π:`[∧@
*≠↓Ae∧¬⊂_⊂∪`@∩$⊃⊃H↓ ∧DD↓
B00986 0 ↓≠↓D∧⊃⊃$∧λλ∪,≤y~ →\⊂)2`&ereNce @≠↓∞sGπA⊃!∀λλλ∧∧λβ"HX_990 L`d$H@⊂Hλα""B@P⊂⊂λ⊂⊂⊂εB!P⊂990λ@β↓MALH@⊂H
∧∧α∧n≤8
≡|λ∀L\Y<Y-ly(∪,≥]8;↓⊃ ∧@⊂λ⊂⊂⊂⊂β@
C`@rb`!β↓AM↓¬α!⊃ ∧DDαD@ ∃ε@b``⊂∧βββ0∧
!⊃ ∧DPλ⊂⊂&pXv4yxλ)2s %p¬K]Fα)α7πw+π0$HA↓↓↓α↓↓4T→AEAβ!↓A@α6β0H⊃⊃⊂HH⊃⊃⊂Jα∧∧αααeference Manual
C01035 00315 Glossary
C01038 00316 Maclisp Reference Manual
C01041 00317 Glossary
C01044 00318 Maclisp Reference Manual
C01047 00319 Glossary
C01049 00320 Maclisp Reference Manual
C01052 00321 Glossary
C01055 00322 Maclisp Reference Manual
C01058 00323 Glossary
C01061 00324 Maclisp Reference Manual
C01063 00325 Glossary
C01066 00326 Maclisp Reference Manual
C01068 00327 Glossary
C01071 00328 Maclisp Reference Manual
C01073 00329 Glossary
C01075 00330 Maclisp Reference Manual
C01078 00331 Glossary
C01081 00332 Maclisp Reference Manual
C01083 00333 Glossary
C01086 00334 Maclisp Reference Manual
C01088 00335 Glossary
C01092 00336 Maclisp Reference Manual
C01096 00337 Glossary
C01097 00338
C01101 00339 Maclisp Reference Manual
C01105 00340 II.I Function Index
C01109 00341 Maclisp Reference Manual
C01113 00342 II.I Function Index
C01117 00343 Maclisp Reference Manual
C01119 00344 Maclisp Reference Manual
C01121 00345 Maclisp Reference Manual
C01125 ENDMK
C⊗;
Table of Contents
The Language
Part 1 - The Language
1. General Information . . . . . . . . . . . . . . . . . . . . . . . .1-1
1.1 The Maclisp Language . . . . . . . . . . . . . . . . . . . . . . . .1-1
1.2 Structure of the Manual . . . . . . . . . . . . . . . . . . . . . .1-3
1.3 Notational Conventions . . . . . . . . . . . . . . . . . . . . . . .1-4
2. Data Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . .1-7
3. The Basic Actions of LISP . . . . . . . . . . . . . . . . . . . . 1-13
3.1 Binding of Variables . . . . . . . . . . . . . . . . . . . . . . . 1-13
3.2 Evaluation of Forms . . . . . . . . . . . . . . . . . . . . . . . 1-15
3.3 Application of Functions . . . . . . . . . . . . . . . . . . . . . 1-17
3.4 Special Forms . , . . . . . . . . . . . . . . . . . . . . . . . . 1-21
3.5 Binding Context Pointers . . . . . . . . . . . . . . . . . . . . . 1-∩4
FuncTion Descriptions
Part 2 - Function Descriptions
¬
1, Predicates . . . . . . , . . . . . . . . . , . . . . . . . . . , . .2-1
α2. The Evaduator . . . . . , . . . . . . . . . , . . . . . . . . . , .2-7
3. Manipulating List Structure . . . . , . . . . , . . . . , . . . . 2-15
3&1 Consepε@@9αq↓9↓p↓0∩αd¬bαr¬dα`$ HD¬HH¬@⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂→⊗@15
3.2 Lists . . ., & . . .(∧@\@8@\@\P@L@8@\@\P ↓9αq↓9↓p↓!↓9αq↓9↓p↓ ∩αdε"k↓Q#~s1_⊗g→<X.M9{@⊂≠q⊂&$\βt StppGiUeJ@\α↓ ∩αd¬bαr¬`α@$ HD¬H@¬⊂∪⊂↔λ↔⊂↔
α & . 2-"3
3.P∪ ∪π⊗c↔M↓p∧α@d HD¬H@⊂
ε ≤@8@\@\α↓ ∩αd¬bαr¬`λ¬⊂⊂∞ . . .P ↓→αq↓9↓p↓ ∩αd¬bαr &&!"LeF"4{N8∧ing & . . .(∧@L@8@\@\X ↓d¬bαr¬`α@$ HD¬H@¬⊂⊂∞ . . .(∧@L@8@\@\α↓I5Mλh ∪~β@≠∧↓Hp@:←→↓↓d¬bαr¬`λ¬⊂∪⊂↔λ↔⊂↔
α ≤@8@\@\P ↓d¬bαr¬`α`$λπ⊂↔λ↔⊂↔ (@L@8@\@\P ↓Ihε3_h!Q#"p_`≠
}h≠`∪λ!ww:≤0∂l (∧@@9αq↓9↓p∧α@dλπ⊂↔λ↔⊂↔ (∧@@9αq↓9↓p∧α@dλπ⊂↔λ↔⊂↔ (∧@@9αq↓9↓p∧β∩k4¬#!ε @_D⊂βonditi`∨]¬Yf@\α↓ 2αβHD¬H@⊂
ε ≤@8@\@\α↓ 2αβHD¬H@⊂
ε ≤@8@\@\α↓ 2αβHD¬H@⊂
ε "
Lhλ(αM↔∧dr2\αadi@=\@@\α↓ 2αβHD¬H@⊂
ε ≤@8@\@\α↓ 2αβHD¬H@⊂
ε ≤@8@\@\α↓ 2αβHD¬H@⊂
ε ≤@HZfp~(h\f∪9←\[Xαs∂π@λWFOL∧h∧¬H@⊂
ε ≤@8@\@\α↓ ∩αβHD¬H@⊂
α ≤@8@\@\α↓ 2αβHD¬H@⊂
α ≤@8@dJ ε@@P¬~↔4 Ca@jπ≠'+≤∧⊗v"λ0mnα97`,h S@:∧pλλ↓y0∩o@I`
↓d¬bαr¬`λ¬↓⊂⊂∞ . . .P→↓d¬bαr¬`λ¬↓⊂⊂∞ . . dαiQXQ!P@ ε@
λ∧∩α$H@$Nα#"@↓ε@
5. AdoMic @'e[E@?dε2αr¬`λ¬↓⊂∪⊂↔λ↔⊂↔ (@@9αq↓9↓p∧α@dλπ⊂↔λ↔⊂↔ (@@9αq↓9↓p∧α@dλπ⊂↔λ↔⊂∩4hr4S)0∪λα5~T⊃P⊂v≤p¬ C@⊃Q@⊃↓p∧α@dλπ⊂↔λ↔⊂↔ (∧@L@8@\@\α↓ ∩αβHD¬H@⊂
ε ≤@8@\@\α↓ ∩αβHD¬H@⊂⊗Z∀FB~W↓∧U42P(≤4πpe@Ii`%αd¬.z⊂⊂↔λ↔⊂↔
α & . . .(∧@L@8@\@\P ↓→αq↓9↓p∧α@$ HD¬H@¬⊂→⊗@52↓α5.3 ThE PriNt-Name ≤@8@\@\P@L@8@\@\P ↓9αq↓9↓p↓ ∩αd¬bαr¬`α@$HD¬H@¬⊂∪⊂→X[εE
W~∧d[82y7~w3P7Yα Symbols , . . . .(∧@\@8@\@\X@\@8@\@\P@\@8@\@\X@\@8@dZj`~∀j\T∪ KLαK;'≠8απS?nK
αONk?3~βπMα7+;∂SL{;M↓r↓0∩αd¬bαr¬dαbαd¬bαr¬dα`$ HD¬HC&f!"C!&KB3N]8Y<NP⊂↔⊂
α . . . . , . . . . , . . . . , . . . . . . . . . ,∧@\@8@dZlT~∀l\D∪≥k[ KdA↓β∪↔∪'≡S↔Mα↓9↓9αq↓9↓p↓1↓9αq↓9↓r↓0∩αd¬bαr¬dαbαd¬bαr¬dα`$HD¬HC&f#"MEf@0sm↑_<Z.={HD¬HH¬DHD¬HH¬dHD¬HH¬DHD¬HH¬dHD¬HH¬DHD¬HHε%-Mc!&KLbλ={]Y.9twwλ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂→⊗K∞FE≠↔
∧`y4]46rz~qP↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂→[XFE
↔~Db↑87w2[:4pz~ww⊂0[2⊂&7Ypy4z~6P#:[1z4w[9P↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ→⊗[\CE≠↔≠αj94s[w7vr]94qP⊃:w1j~ww9Pλ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂→⊗N_εE≠≠Di0[27vP⊃:w1j~ww9P⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊗\_FB≠↔≤∧S7stqXv⊂'x→y0z4[w9P7[⊂':vX2y9Pλ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂→⊗LεEεE
U∧ad_y0qz→y⊂&p[4x:v_z4wwλ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊗\~FB≠W_DPt0a0Xz2y⊂∩βbjects . . . , . . . . , . . . . , . . . . . . . . . ,∧@dZ`j~∀n8d∪πQ¬eCGi∃dA'iIS]Of@\@\X@\@8@\@\X@\@8@\@\\@\@8@\@\X@\@8@\@\\@\@HZpr~(~∀`\%βeeCef@@9αq↓9↓r↓1↓9αq↓9↓r↓1↓9αq↓9↓r↓1↓9αq↓9↓r↓9↓9αq↓9↓r↓9↓9αq↓9↓r↓1↓Ihπ∪λh!Q#Jp→\↔πε≥lr∧7]l7&N⎇n2ααd¬bαr¬dαbαd¬bαr¬dαbαd¬bαr¬dαbαd¬bαr¬dαrαd¬bαr¬dβ∩k↔⊃PPh!Q hPQ!⊂HH∀∧¬&FT
7O∨L]PhPQ!⊂HJ∧∧ααα
λ↔↔"ε4αj¬MR¬∨≡:F.hQ!PPλ&∃`M&T¬∨O>LVjαβHD¬HH¬@⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂α . . . . . . . . . ,∧@\@8@\@\LZb~∀D\bβ)!JA)←@A→Km∃XA
k9GiS←8@\@\\@\@8@\@\X@\@8@\@\\@\@8@\@\X@\@8@\@\XfJB4⊂b\d%↓eKC-a←S]Qf@@\X@\@8@\@\\@\@8@\@\X@\@8@\@\\@\@8@\@\X@\@8@\@\X@\f4j~∀b8f∪π←9ie←X↓πQCe¬GiKeL@\@\X@\@8@\@\\@\@8@\@\X@\@8@\@\\@\@8@\@\\@\@8fZr~(bTh∪∃qGKaQS←]C0Aπ←]⊃SiS←8A⊃C]⊃YS]N\@\@8@\@\\@\@8@\@\\@\@8@\@\\@\@8@fZbT~∀b\P\b∪)!JA→∪M AeI←dA'egiKZ@\@\\@\@8@\@\\@\@8@\@\\@\@8@\@\\@\@8@\@\fZbj4∀b\h8d∪+g∃dA∪]QKeekAif@@8@\@\\@\@8@\@\\@\@8@\@\\@\@8@\@\\@\@8@\@\\@\@LZbl~(b\h\L∪πCi¬Y←Ok∀A←LAUgKdA%]iKeIkahA
QC]]∃Yf@\\@\@8@\@\\@\@8@\@\\@\@8@\@f. . . . . . .3-28
1.5.2 Functions for Debugging . . . . . . . . . . . . . . . . . . . . . 3-28
ii
1.5.3 The Trace Package . . . . . . . . . . . . . . . . . . . . . . . . 3-35
1.5.4 The Stepper . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-40
1.5.5 The MAR Break Feature . . . . . . . . . . . . . . . . . . . . . . 3-56
1.6 Storage Management . . . . . . . . . . . . . . . . . . . . . . . . 3-60
1.6.1 Garbage Collection . . . . . . . . . . . . . . . . . . . . . . . . 3-60
1.6.2 Spaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-61
1.6.3 Storage Control Functions . . . . . . . . . . . . . . . . . . . . 3-64
1.6.4 Dynamic Space and Pdl Expansion . . . . . . . . . . . . . . . . . 3-65
1.6.5 Initial Allocation . . . . . . . . . . . . . . . . . . . . . . . . 3-66
1.7 Implementing Subsystems with Maclisp . . . . . . . . . . . . . . . 3-69
1.7.1 Entering LISP . . . . . . . . . . . . . . . . . . . . . . . . . . 3-69
1.7.2 Saving an Environment . . . . . . . . . . . . . . . . . . . . . . 3-70
1.7.3 Gaining and Keeping Control . . . . . . . . . . . . . . . . . . . 3-73
1.7.4 Purity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-74
1.8 Miscellaneous Functions . . . . . . . . . . . . . . . . . . . . . 3-79
1.8.1 The Status Functions . . . . . . . . . . . . . . . . . . . . . . . 3-79
1.8.2 Time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3-102
1.8.3 Escaping from LISP . . . . . . . . . . . . . . . . . . . . . . . .3-102
1.8.4 Additional Functions . . . . . . . . . . . . . . . . . . . . . . .3-104
The LISP Compiler
Part 4 - The LISP Compiler
1. Peculiarities of the Compiler . . . . . . . . . . . . . . . . . . .4-1
1.1 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4-1
1.2 In-line (or Open) Coding . . . . . . . . . . . . . . . . . . . . . .4-3
1.3 Function Calling . . . . . . . . . . . . . . . . . . . . . . . . . .4-5
1.4 Input to the Compiler . . . . . . . . . . . . . . . . . . . . . . .4-7
1.5 Output of the Compiler . . . . . . . . . . . . . . . . . . . . . . .4-8
1.6 Functions Connected with the Compiler . . . . . . . . . . . . . . 4-10
2. Declarations . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-11
3. Running Compiled Functions . . . . . . . . . . . . . . . . . . . . 4-17
4. Running the Compiler . . . . . . . . . . . . . . . . . . . . . . . 4-19
5. The Lisp Assembly Program, LAP . . . . . . . . . . . . . . . . . . 4-25
5.1 LAP on the pdp-10 . . . . . . . . . . . . . . . . . . . . . . . . 4-25
5.1.1 The LAP Function . . . . . . . . . . . . . . . . . . . . . . . . . 4-25
5.1.2 Valid LAP Code Forms . . . . . . . . . . . . . . . . . . . . . . . 4-27
5.1.3 LAP Syllables . . . . . . . . . . . . . . . . . . . . . . . . . . 4-31
5.1.4 Differences Between lap and faslap . . . . . . . . . . . . . . . . 4-35
5.2 LAP on Multics . . . . . . . . . . . . . . . . . . . . . . . . . . 4-36
5.2.1 LAP Words . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-36
5.2.2 LAP Instructions . . . . . . . . . . . . . . . . . . . . . . . . . 4-37
5.2.3 LAP Operands . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-39
5.2.4 LAP Expressions . . . . . . . . . . . . . . . . . . . . . . . . . 4-40
5.2.5 Using LAP . . . . . . . . . . . . . . . . . . . . . . . . . . , . 4-41
iii
α6. Calling Prkgrams Written in Other Languages . . . . . . . . . . . 4-43
6.1 The defpl1 Declaration . . . . . . . . . . . . . . . . . . . . . . 4-43
6.2 Producing fasloadable fiLes with the Midas Asseebler . , . . . . , 4-∀8
7. INternal ImplementatiOn Detaids. . . . . . . . , . . . . , . . . . 4-53
7.1 The PDP%10 Implementation. . . . . , . . . . , . . . . . . . . . , 4-∃3
7.2 Co@9mK]i%←]fA→←dA
U]GiS=]fAS8A→Sg@\@\@8@\@\\@\@8@\@\\@\@8@\@\\@\@PZjf~(n\f∪%]iKe9CXA%=kiS]∃fAM←HAkgJ↓ErA→¬ AG←⊃JT@\P@\@8@\@\X@\@8@\@\X@\@8@hJjd~∀n\P∪%←kQS]Kf↓MWdAβ+O∃β↔Iα#πv!6∂?&+⊃α2 ↓↓9↓r↓ ∩αd¬bαr¬dαrαd¬bαr¬dα@$HD¬H
β&f#"Mef"5~T∪=;∞
8|h ≥<≠⊂∩[rs:0]4ww⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂
⊗[XεB≠W≠∧Q0z0P∀2x92\pw:0]4ww↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂~⊗KLεA≠W
Dbw;~y7w6Yw:⊗⊂∀z0qu\V⊂)2Ytyz2\9P↔⊂
α . . . . , . . . . , . . . . , . 4-73
5*8 Calling SeQuafces. . . . . . . , . . . . . . . . . , . . . . . . . 4-74
7.9 Operators. . . . . . . . . . , . . . . . . . . . . . . . . . . . . 4
74
I. Glossary
II. Indices:
II.I FuncTion Index
II.II Atom Index
II.III Concept IndeX
¬
iv
Part 1 - The Language
¬
1" General Inforeation
¬
1.1 The Maclisp Language
Maclisp is a dialect od Lisp developed at↓~]∩]PP@∨M¬βK?+.≠Qα6→↓βπv!α5:JrQ9∨_h*πK&K≠'∂N1α'w#↔33N;↔;∂*α3π␈∪πS?↔Iβ≠?⊂βWO∃εK9βπ↔#'≠π≡Kπ1↓εK;S↔dc'∨↔v≠∃βK/≠↔πK≡@4+πv!↓βK.cπS↔ β≠'↔f#M9↓αα7π∂dKOAβM→↓β∪/≠∂↔;&+⊃β≠⊗{5↓β&C∃β∞|k7?;gI7/;⎇;9↓αfK@∨αε∃c(h,M⊗∞f\:CJε
zv/6↑%Bεn≥o∩ε6\≡G/⊗↑4ε}2∞Mε*εL≥f?.≤|RεF≡h $Y9;Dz_;L|9λ≠n$_=!m\9]→,EC"C!$λλ∃
<h→
|⎇;9-nλ~0→H4w:2[22b both as apefeRence qource foHAiQJ↓YC@:?+π∂∃∧;⊃β∂_4+¬¬+O↔ ?→β∨WN#∀'SzβS#K,)β'7εc↔7↔w#πS'|sM2∧∧¬&F↑8Rε∂,UBεNd∧ε≡G-yf}f|⎇⊗≡∞Dλn→<C↓Q]~→$∧∪+R%JHλλ≡]~1M≤z8;∧ 9]→-Mα4sr[1rP⊂∪0q∪yH⊂4vx≠2rrg≥0r4g[⊂7w∧]42P⊂⊃ ¬C pdp-!⊂
coMpqteR ufDep∧AiQ∃Sd@Aα{C↔K∂#';≥¬≠gOS,iα&R~aβ#↔⊗+π6LXD∧≤Y0∪→y92bλ:7@ !pε@@EQQJA∪Q&~∃S5aQK≠∃]aC&K?91⊂∧α¬π-x
L\⎇λ∪(_i|h∧
9<∪]9;]≡~;sD
yHλ πw2`9w`YX≥`
β[,ε'<∧p∂nA@∨→∧εFF(β"S.]≥~0⊃\β sySte`~X↓QKeK¬I`∪↔⊂∧π,9Y →≤αed QZAC↓~↓↔~⊃( ↑8ε"4XyP4`-p` K↓n+;@&_¬~-⎇KB,≥Yλ⊂~~2BEverc@Sαs9↓β&CπQβ↔+;M↓∧{9βSF)↓α∩,→βC∪αiE@'(s∪↔I∧"⊗
∨~↓αR>¬→5EAαβ?C↔⊗S'hpλ∞|yz2[P∧
!KeKC→aKd@α≠π33,∧Bαα.Mε*∧HX2k∧ ⊗OεLYV.wL≡FN}e`λA~~→(λλαaV@00 I5a@∪⊗¬\Vw_0~4[w⊂0v≤βo
Ic]fAU]IKdα↓αR⊗t*aβmentations are closely related, they are sometimes referred to
collectively as the pdp-10 implementation. There are reputed to be several
other implementations.
These implementations are mostly compatible; however, some implementations
have extra features designed to exploit peculiar features of the system on
which they run, and some implementations are temporarily missing some features.
Most programs will work on any implementation, although it is possible to write
machine-dependent code if you try hard enough.
The Maclisp system is structured as an environment, which is essentially a
set of names and bindings of those names to data structures and function
definitions. The environment contains a large number of useful functions.
These functions can be used through an interpreter to define other functions,
to control the environment, to do useful work, etc.
The interpreter is the basic user interface to the system. This is how the
user enters "commands." When Maclisp is not doing anything else, such as
running a program, it waits for the user to enter a Lisp form. This form is
evaluated and the value is printed out. The form may call upon one of the
March 3, 1979 Page 1-1
Maclisp Reference Manual
system functions (or a user-defined function, of course) to perform some useful
task. The evaluation of a form may initiate the execution of a large and
complex program, perhaps never returning to the "top level" interpreter, or it
may perform some simple action and immediately wait for the user to type
another form.
It is also possible to get into the interpreter while a program is running,
using the break facility. This is primarily used in debugging and related
programmifgactivities.
The functions invokeD by the top-level interpreter May be executable machine
programs, or they may themselves be interpreted. This is entirely a matter oF
choice ¬]HAG=]mK]%K]GJ8@@A)!JAgsMiKZ@↓Mk]GQS←]f↓CeJ@↓[←gi1r@A[¬GQS]∀Aae←≥eCKf8~∃+g∃`AMk9GiS←9f∪Ce∀Akgk¬YYb@↓MSegPAkgK⊂AS]i∃aaeKQSmKYd\@@A¬MiKd↓iQKrAo←e,XAiQ∀~∃G←5aSYKHA[Cr↓EJACAaYSK⊂Ai↑@↓iQKZ0Aike9S]NAQQKZA%]i↑A5CGQS9JAae=OeC[L@AoQ%GPAG¬\~∃i!K\AE∀AY←C⊃KHAS9i↑Ai!JAK]YSe←]5K]h\4∀~∀@AβYX↓←LAi!SfASLAI←]∀AoSi!S\AB↓gS]O1JAG←9gSgi∃]hAY¬]OkC≥JXA→%c`X@↓oQ←g∀AmSeQkJ~∃%f@Ai!ChAi!J@AI¬iBAgQekGiUeJ@A%fAgS5aYJ@↓C]HA≥K]Ke¬X@AK9←kOP↓iQChAae←≥eC[f↓[Cr~)KCgS1r∪←a∃eCiJ↓←\@AAe←Oe¬[fX@↓C]HAQQCh@↓iQJ@↓ae←OICZAgQekGiUeJ@A%f@Ag%[aYJ↓C]H~)OK]KICXAK9←kOP↓iQCh↓ShAG¬\AEJ↓kgKH↓CfAB↓G←[[¬]HAY¬]OkC≥J\~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~)!COJbZd∩$∩@@@&bZb8b∩∩∩@A≠CIGP@f0@brnd~∀_∩∩∩@@@@↓∂K]KICXA∪9M←e[¬iS←\4∀~∀~(b\d@↓'iek
ikeJ↓←LAi!JA≠C9kCX~(~∀~∀@A)Q∀A[C]UCXASLAOK]∃eCYYdAgieUGike∃HAS]Q↑AgK
iS←]LA←\AACeiS
kYCdAi←a%GfvA∃CGP~)gKGi%←\AG=]iCS9fAKqAYC]CQ←er@↓iKqh↓C]HA→k]Gi%←\AI∃MS]SQS←]f0@AS]QKega∃egKH8@A∪\4∃OK]∃eCXXAKCG ∪gKGQS←\A
←]iC%]f@A ←iP∪∃YK[K9iCer↓C]H∪
←[aY∃p@A[¬iKeS¬XXAo%iP~∃
←[aY∃qSir↓S]Ge∃CgS]≤Ai←o¬eH@AQQJAK9HA←LAiQJ↓gKGi%←\\∪¬\@ACaS←[CQSFXAMiK`[ rZ~∃MiK`A⊃KmKY=a[K]P@ASf↓]←hAUgKH\$A
eKEkKMi1rAiQ∀A[←e∀@AG←5aYKp↓S]M←I[CiS=\@AS8AB~∃MKGiS=\AoS1X@ACMgk[J↓W]←o1KIOJ↓Me←ZA←iQ∃dAgK
iS←]LAoQS
P@ACAaKCd↓YCiKH@AS\↓iQJ~)[C]k¬X\@AQQJ@A9KnAkMKdASL@ACIYSgKH↓iVAg-S`@A¬e←k]⊂XAeK¬IS]Nαβ↔πKgI↓β∂FCS↔↔→βπ: h+↔π⊗ceβO.≠S'?w→β?→∧≠#πC&+CMβ6KCOQph(4 α↓α?≠&+9β∪/≠∂Kππ#'?;~↓β?→∧c'OAε3W;∂&K?;Mαβ←'∪bβ∃β>K[↔9αβ;?Q∧¬vvg∀λ
-dλ≤∀M}y(⊂N↑β"X-N{h⊂∀[⊂:2i~yP7sλ7z42\⊂&4i\⊂3:w_z4ww≤Pε These Are as acc@UaCiJ↓Cf@AA←ggS YJXA kh~∃MQWkYα!β;>"β∃β&'↔d
F}z
H
.L<X;
N+Hλ
M→: →λ4ptwλ8:y8≠yrP )pεAi↑↓g@↔JεhRε∂4∧ε
π9x
.y#"M|H→0≤_vx6 %pεD
∀4∀@@A¬GGKgMS]NAαC;≠?⊗kπS'|¬bεNd
FF*
\⊗w∞≥DεO~LWε.lLVw"
xDYp~4λ:42P≤yryβ\P62k→v⊂7`& αabiliti and @QQJAaUaa←f⊂AMO∧αβW#'≤¬απ≡Tε␈∩ RεO4λ
.pp∞G↓aQJA5C]kC0P ↓↓¬## ?\⎇αε≡|`W α@
Do co@-∃` βK,∧⊗&NβY`⊂~yP77]⊂92`#omeE↓9IKH!iQ←,;!β;xεBε/λ8∞↓p∧e@HαA1β&α@εO~∞0
,|βry@4e`λAi!Ch~∀β≠?7⊗x¬f*π⎇
rεF≤4εv.lXD∞≤Y0≠~wzy`,y s∃K\Ai!SfA[¬]cCX↓Ee@>α}6*πM∞&␈.⎇λ∧
=λ∞↓0∂uC@!S]N~)iQJAα∪↔∂'vs';≤∧¬f$→08m∧≤⎇0⊃→4{$@sion @QQCH∩αK@~εM⊂nL9∀≠⊂:42H*0q6→P7s⊂λ!sw*→w: ∪, i`≤~)[eIKβ⊃β@&t→L≥8∧v)ar`∪↓PBεF≥↑6.fdλN⊂4"@2pπ@↔Ldπ>OMλ∞↓42P&Xz2y4_v⊂:4_z⊂$@t cgn@QC@'n5bα∧MqP@,X;Q∧8π⊂answe@HA`∪=αβ@≡}XTπε∞∧P~4Xzpar q`+↓(∞7&Nβ{@⊗λ0π`≥
A@7↓↑0
∧∞αq`% one =@→↓β&C∃βC⊗sS'∪,∧@H⊗≤0λl↑|h⊂⊗Yz4'@$pε@9↓¬≠' 68TπM→(⊂⊗Xu2`vλ4qP 3pre@Fβ#@/⊗X ⊂_8 topics oje ↓
CTAkβ≠∃βSF)αSπ⊗c∀4-p→Dλ{{U]β: 3 p QC↓ ∧εO~λ`≠@\¬jdAαQβSF!β⊗>K0⊗X∧w#H0∂f QQJA≠¬]`↔πbaβπh ⊂≤∧he ↓5[eJ@ε#↔SπH
F.β"@:_q0eLA@?→&nwLPN∞h⊂∪n¬`↔+⊂∧∧ε∂α∞Mε*ε,P m≥Xπ )↓9@≥β?2β↔π∞¬λ∧πs⊂4he s↓!pA[↓∞S0∨∩∧≡X
3, p ↑~)@≠'h ⊂≥pλebe i`≥↓0
`.0
a@i![TA↓xbε
λ y-@2p∩al c`→CM`
β←H¬FD_Y(↓0∂uN@⊂P→↓α(
gN\ ⊂h¬Y`∪<∞FF*λ0⊂[8¬al
λ¬S@M⊗G≡β`⊂fac`∪XεC@&∞¬→0∩λ18 ↓QQJA∂1P∂ON∂∪e↓α∧≥f"πMλ ∧λxπw "eptA ;∪⊗β∧∞βp )↓λ!βεε,Rαεh`:[αd Atλ
+↓Mλ ∧8π $8@@Aβ1`∂-α∂!β@&λ "Yu2 ↓82πMλ ∧∧≠0;N↓pp@ε@⊗*λλ ⊂λ ε`+↓t∧ .↓4p∂n↓∪P≠∪(παε∞βY⊂λ0p∞ Ap @∨]⊂_@B¬∃'sαkβ}@λ∩-L→8 u`⊃SFαAβπ↓,Tππ⊗βxX,ε0→@αk7OQαβ@/≡X @:Z⊂:7@_P92`'qha@dαβπ+⊂∧≤L↑→0⊂z→p∧ @jπ≠↔Iα¬p→A↓@
`)Q⊂AISC1KGh_αβ7Iβ&yβπd→∂∞→<Z,]Xp∩@d us@⊃` β?2βπ+x
~↑H⊂∩4_t2`#↓PXAoQ<A`∨&ε0~↑`∧`4o f`∪]⊂∩+x
:λ8∧hE ah
Go⊃` βSx↓β¬β∂+↔OSH¬`-D_8[N↓x⊂ @ sp@Kα≠'6α8h↓8¬`≥↓_∞FN↑e`λ∧
x⊂∩@. `∨M
AgK↓_∞FN↑d@Xε~*εMε*εX≥g∞∞β⊂apπgk≠⊃`
β.v{←#⊗∧Lv*ε|dε∞Vβp
4→y⊂9@%atio8ABA`α≡(⊂↔*[q2y p¬KM
π∪↔+∞*↓β@&t≥
εEn¬iQKdαβ@≡8⎇~-⎇H≥z-α⊂#r[2q0v~8 @E∀AOS0∧Frpβ"C!
∀~(∩(Q!P@ ε@
∃≠CIC@@ε0@b@e;H$∧⊂λλ∧∧∧`_@-1 d∩ ∩β!C≥J@b↓hε0hP@H⊃∀αα∧β88mM<|λ
,9Q →→u1rP∪pp∞ualλ
(hP$S∃`d∧⊂π7@tatio9CXAεα{;@6]jFN}n1P@ α@
@)!KeJAαC∃β≤¬vN(⊂`↔[92w:~ww9P≠pε @]=aC@SL¬frπM↔"ε↑Z7"ε,Tε@\f the characters equal sign and greater than symbol, "=>",
will be used in examples of Lisp code to mean evaluation. For instance, "F =>
V" means that evaluating the form F produces the value V.
All uses of the phrase "Lisp reader," unless further qualified, refer to
that part of the Lisp system which reads input, and not to the person reading
this document.
The terms "S-expression" and "Lisp object" are synonyms for "any piece of
Lisp data."
The character "$" always stands for dollar-sign, never for "alt mode,"
unless that is specifically stated.
The two characters accent acute, "'", and semi-colon, ";", are examples of
what are called macro characters. Though the macro character facility, which
is explained in Part 5, is not of immediate interest to a new user of the
dialect, these two macro characters come preset by the Lisp system and are
useful. When the Lisp reader encounters an accent acute, or quote mark, it
reads in the next S-expression and encloses it in a quote-form, which prevents
evaluation of the S-expression. That is:
'some-atom
turns into:
(quote some-atom)
and
'(cons 'a 'b)
Page 1-4 ∪1-1.3 March 3, 1979
General Information
turns into
(quote (cons (quote a) (quote b)))
The semi-colon (;) is used as a commenting character. When the Lisp reader
encounters it, the remainder of the line is discarded.
The term "newline" is used to refer to that character or sequence of
characters which indicates the end of a line. This is implementation
dependent. In Multics Maclisp, newline is the Multics newline character, octal
012. In ITS Maclisp, newline is carriage return (octal 015), optionally
followed by line feed (octal 012.) In dec-10 Maclisp, newline is carriage
return followed by line feed.
All Lisp examples in this manual are written according to the case
conventions of the Multics implementation, which uses both upper and lower case
letters and spells the names of most system functions in lower case. Some
implementations of Maclisp use only upper case letters because they exist on
systems which are not, or have not always been, equipped with terminals capable
of generating and displaying the full ascii character set. However, these
implementations will accept input in lower case and translate it to upper case,
unless the user has explicitly said not to.
March 3, 1979 ∪1-1.3 Page 1-5
Maclisp Reference Manual
Page 1-6 ∪1-1.3 March 3, 1979
Data Objects
2. Data Objects
Lisp works with pieces of data called "objects" or "S-expressions." These
can be simple "atomic" objects or complex objects compounded out of other
objects. Functions, the basic units of a Lisp program, are also objects and
may be manipulated as data.
Objects come in several types. All types are manifest; that is, it is
possible for a program to tell what type an object is just by looking at the
object itself, so it is not necessary to declare the types of variables as in
some other languages. One can make declarations, however, in order to aid the
compiler in producing optimal code. (See part 4.2.)
It is important to know that Lisp represents objects as pointers, so that a
storage cell (a "variable") will hold any object, and the same object may be
held by several different storage cells. For example, the same identical
object may be a component of two different compound objects.
The data-types are divided into three broad classes: the atomic types, the
non-atomic types, and the composite types. Objects are divided into the same
three classes according to their type. Atomic objects are basic units which
cannot be broken down by ordinary chemical means (car and cdr), while non-
atomic objects are structures constructed out of other objects. Composite
objects are indivisible, atomic, entities which have other objects associated
with them. These other objects may be examined and replaced.
The atomic data types are numbers, atomic symbols, strings, and subr-
objects. Atomic symbols can also be regarded as composite. See below.
In Lisp numbers can be represented by three types of atomic objects:
fixnums, flonums, and bignums. A fixnum is a fixed-point binary integer whose
range of values is machine-dependent. A flonum is a floating-point number
whose precision and range of values are machine-dependent. A bignum is an
infinite-precision integer. It is impossible to get "overflow" in bignum
arithmetic, as any integer can be represented by a bignum. However, fixnum and
flonum arithmetic is faster than bignum arithmetic and requiRes less memory.
Somatimes the word "fixnum" is Used to inclqde both d¬Sq]U[fAC9H@AE%O]k[L@QR]∀\~∃C1XAS]QKOKeLRvAS8AiQSLA[C]UCXXA!←oKm∃dXAi!JAo←IH@EM%qUkZλAoSY never be used to
include bignums unless that is explicitly stated.
March 3, 1979 ∪1-2. Page 1-7
Maclisp Reference Manual
The printed representations for numbers are as follows: a fixnum is
represented as a sequence of digits in a specified base, usually octal. A
trailing decimal point indicates a decimal base. A flonum is represented as a
set of digits containing an embedded or leading decimal point and/or a trailing
exponent. The exponent is introduced by an upper or lower case "e". A bignum
looks like a fixnum except that it has enough digits that it will not fit
within the range available to fixnums. Any number may be preceded by a + or -
sign. Some examples of fixnums are 4, -1232, -191., +46. An example of a
bignum is 1565656565656565656565656565656565. Some examples of flonums are:
4.0, .01, -6e5, 4.2e-1.
One of the most important Lisp data types is the atomic symbol. In fact,
the word "atom" is often used to mean just atomic symbols, and not the other
atomic types. An atomic symbol has associated with it a name, a value, and
possibly a list of "properties". The name is a sequence of characters, which
is the printed representation of the atomic symbol. This name is often called
the "pname," or "print-name." A pname may contain any ascii character except
the null character, which causes trouble in some implementations. For examplE,
a cerdain atomic symbol would be represented externally As foo; internally as a
structure containing the value, the pname "foo", and the propertieq.¬
There are two special atomic symbols, t and nil. These always have theiR
respective selves as values and their values may not be changed. nil is used
as a "marker" in many contexps; it Iq essential to the construction of data
structures such as lists. t is usually used wheN an antithesi@LAi↑@↓]SXA%b~∃e∃ckSe∃HAM←HAg←[∀AakeA←gJX↓J]N\↓i↑Ae∃aeKg∃]hAi!JAY←≥SGCX↓G←]I%iS←]L@@EiIkJDA¬]H~∀ MCIg∀\DAβ9←iQKHAae←AKeir↓←LAi!JAga∃GSCX↓Ci←[%FAgs5E←XA9SXASLAiQCPASif%GCdA¬]H~∃%ifAG⊃dACe∀ACIO¬sfA]%X\~∀4∀@@AQQJAm¬YcJ@↓←LAC8ACi←5SF@AMs[E←0AGC\↓EJ@A¬]rA← UKGh↓←L@A¬]rAieaJ\@A)QKIJACe∀~∃Mk9GiS←9fAi↑↓gChA¬]H@A≥KhAi!JAmC1kBA←_∪BAge[E←X8@A¬K
CkgJ↓Ci←[%F@Age[E←YLAQCm∀~∃mC1k@↔MεOO?≡KπS↔ β←'SBβS#⊗haβS#-Iβ∂πp↓β∃π+O↔⊃∧Mβ[∂∪'πf+@~ε≥`ππ⊗|}&∞o4∧ε∞vDλ↔_h$,G.n←∀ε∂⊗|YV.wL4"εNd∧ε .9Xp~~ww9Wλ⊂ z~yP0v≤wP⊂8≠yyta≠2P# /p∧AC\↓Ci←[%F@Age[EOX↓iV~∃!CmJA9↑AmC1k@∃1∧¬⊗rπ⎇
⊗≡B8↔∞*
~BεO4∞6∞ND
Fzε,Tαπ∞lLV&NlX ∧$≠|H∧.;X[n]YHAQA"H∧∧∃~→$∞≤[|↑]≡(
M<⎇λ
|H_;D=≠{-≤h≤}-\[{λ
≡h→>∞
_:;L\λ≠{D∞_9y$εK-,Edλ∩=∧
<h≥.<9β"Lm|H≤n\zλ≥
;Y|d<hλ∞,8{|LM;Y`∞M→(→L≤⎇λ≥
=λ⊂-a8=≠m]8h≤o≥8[{∧
<h≥
(≠X-\(λ≠lD_#"Ln;Xu
≥{KC!!"Hλ∧λ;H_.M{:8d∞};8M⎇λ≥z.Mλλ≠ml(≠tD
[h_m<X8nL<\h
≥Hλ~.Nh≤≠L≥9(~.4≠y]]Hλ_l≥≠→9∧#"HL=_<X,>→<H
|ZY8nDH_;LD≥<y,D≥≠h∞,<≤Y.<;]λ≥H_<l=:(_m<X8nL<KH∧
~→(≡≠{:,4≤};,-{β"N⎇=~λ∀≡Y<Mu;→;L}~λ≤
l;9(∞,<≤Y.<;]≤d∧≥~→$<xz-∀≠];
D_z_.,8⎇→.%λ_;LDλ≥~T≤};,-{≤c!!"C"J9y(ε∃.α"!∀λλλ∧αl+,Ea""(∧∧∪8<L=λk∧ε.-n!Q@↓A"""$λ_=_$ xZY,>≤c"AQC"]m≡~λλ
⎇Y+8m<X8nL<Hλ∞
X;9.4λ≤Y.∞Y<y-nα=~Tλ_z≡X8⎇↑B=z
≤zλλ
≡hλ≥
:<H∞
X;9%a"Q]-l⎇~;mnh≥z
≤zλ≥≥y(λ=_<X,>→<H
|ZY8nNh_<d
;\≥.Dλ≥<n\;≠≡$;≤{d8xy.∞λλ_$∞⎇≤Z-lc"[ml(_z≡X8⎇↑H≠≠mlh≠|D(→Z/
];(↑=8;∧∞≠h≥
(_<l=:+8m|→(≥L≥≥9(m|H≥
(_z≡X8⎇↑KC"H=_<X,>→<H
|ZY8nNh_<LT_;≥l∨<h~-n→<[L\λ≠{D∞~→(
|X<\L∨(
≤l\(≤_,|(K&W
+C!!"Hλ∧λ;[⎇
<H∪
≡|λλL=_(∞O<→(∧
<h≥
(≤⎇∞-;YkD∧λ∃~
≡h~<d∧_(≤l↑=9;L<(λ≠ld_z_.,8⎇→..c"J∞
||z,-≡(≡L↑[k;]Y⎇~¬∃Hλ∀nNZ;Yn4_<Y$∞<y9∧∞≠h~
⎇→λ≠,↑|x9l↑h≥≠dY(≥∂≡→9α-}=λ_-lβ"]
t≠8;M≡≥;_.L(≥→/∞λ≥z]Hλ≥
(≤⎇∞.8⎇≥.,(≠yD∞~→(∧∞→>≥∧
<h≠M}λ_<∞∞[|≤M≤=→",m|H≥
#"].<(≠yD∧[~<nD≤≤[l<<|z-lkHH
M→(≤∞-;]→,D≤Y<∞,<y;NL=~;md≠yH∀≤⎇≤M≥Yh~.4λ_(∞<<=9-ly#"M|H_z≡X8⎇↑\h→-l{≠|l\λ~;D≠⎇8ML+<=-}→<k∧+YkD∧Y[{d%Hλ∩,d_(λD
<h≥
tλ_Y$
;X{∞\→9β!-;Hλ∞M→(λ∞>≤Z;Luλλ~.Dλ~<d∧≥|Z.N→;H∧∞≥z8lUλλ→%lkHλ∧,[{hD,X<HD∧~<h∧∧→[{d,X<KD∧λ∩;AQZ;<
L;9;NL=~;mnh≥z.M≠⎇=∧∞⎇≤Z-l|kλ≡≠{:,4λ≤}-\[{≤d<Y(∞↑y9λ
≥\⎇→,≤Hλ∧
~→(∞≤,&↓"Z;.
→;9-n_=~-⎇\h_n↑\Y;NM≡(≠≤zh≤nNZ;Yn5C"C!$λλ⊂$∧\⎇8N%;xZL\⎇λH
≡h_(∞>→8z,≥λλ_.M{:8d_=_%↑≡<→$∞z≠|lT≥<y$
<b;M}[8;
O(~~,L→;C!-;H≥
(~;.
→;9-n_=~-⎇KB0$∞⎇8\E]xZY,>λ≤Y.∞Y<y-n≤h→/8⎇=≤[→(
\8z~-l(λ_m|→+H∧
~→#!,];XnM;{\d]:;∞D~;]
tλ≥~T∪~<n∧≤}<nL;(_.,(λ≤n\\K;l-Y8⎇∞5λ_<d<Y(∧∞<y<D];XnM;{\aQ]~_.D~_=LT_Y9-d_{{.
;→9¬dλ⊂(∞>8\K-|ZY8nD~_<d
[h≤∞-;]→,D≤Y<∞,<y;NL=~;meα<{d88z↓Q\}<nL;(→N]X⎇~-⎇H~_.4_;H≡≠{:,4≤};,-{λ≥m
8zλ∞<<]Y.4_<h
≡≤h≠L≥9+B*M→(λ∞?;8[mD~_<aQ]~→$∞⎇8\E]xZY,>λ_<d(≤≤M}→<]∂∃C"C!$λλ∪ml(_{m↑≠|z.L(λ→≡_(≥∂≡→(~.1=~→$<\X/∃Hλλλ≥H_<N,>(_m⎇\z<nNb;yD(λ≠N]8Y<D
yC"L<;≠≤eD→88m∧≠yH∞⎇~8z∧∧≠8>${{]≥;H_-o(∪~.>λ≠xM,8⎇D∧λ∃~T_y;
Nh≠yD;Hλ≡\X>$<Y#!,8xy.>y9λ/(≤⎇,.x|Z.∞~;Yg4→88m∧_y;
D~<h
l;99∧↑(_$∞≥<≠T≠yH
≥]→9l↑\kH∧∧⊂;H≡\X>!Q[8>$
_=Y$
{Y(
}H≠;n,(→~-\;\z-⎇\nh∞M→(≥.∞→<H
M;:=∧
{H≥
(≠]-\Y<H
|H→~-\;\z-⎇\h~.1"Z;.
→;9-n_=~-⎇K9→,m;Y9¬dλλ⊂-dλ_<N,>(~.1;[⎇∧∧_;≥l∨<h_.>{xz,≡→9α.⎇=~λ∧;H_.M{:8aQ\};,-{λ≥m
8zλ
≡h~=∞4≠X;,UHλ∀L≡~→<EDλ_;D<\X/∀~<h≥≥x>.4→→<m≤{X=\λ_↑$∧_;H≡\X>%Q"\≠m≥]→<ED≥z~,=λ~<d(≤|\z8;∧
z;Y∧
yH_.M{:8d ~<|∧
xZY,>HλλnY<=,]]≠≡%Dλ_;D<\X/∃#"\
⎇;]→.$≥z;
D_Y(∧∞≠_8l\λ≠{D∞~→".∞[|→..≡(≠
≡⎇λ≠ldλ_(∞?;8[mD≥;Y↑Hλ≥
(~;LM8x=
}C"X..X>(≥Yλ≥
;H≥
=λ≤o≥8[{∧∞z;≠∧Y(≥.<9λ_.4≥~→$
X;9$
yH≥
(_<N,>+λ∞=;Xy$∞};8M⎇≤c"L<;H~≡Y(≠-l;;{M≤h≠X-\<h_-lλ_(∞,8<{ml8[→$∞≤Z;NL9λ≤L↑≤Y<l]]_=
≥{KH∧
y9(∞9y(ε%.,#!,[|H≥H→>∞
_;X.M;{H
|H~≠nt≥≠h>Y8=Uλ≥<lUλ_;LD→→;↑→(_..X><ea"C"D∧λ⊂;M}~→<D{{<
}z=→$_=_$∞≡<→$
<hλ∞M→(→M≥→+;l-Y8⎇¬D≥z~,=λ~<d→<xn-8Y9↓≥{H≤≡]β"FULkC!!"Hλ∧
~→".={→(∧
[{K,≡≠{:,4λ→_.L(≥≡.(λ~.4λ≥~TλλXm⎇\kHD∧⊂(λ={\b-≡hλ_$∞⎇≤],>≥<Y!QX{{NL:;Z-lhλ≥∞⎇hλ_m⎇<≠{L]]≤k∧x;≠\λλ≥
(λλL<<HH≥Yλλ∞M→(λ∧,y≤HD∧→[|D
~<⎇
}Z8x-A"\Y,≡{{\edλ
∃
<y(≡Y(≠L≥9<h∧
yH→M≤;→≤d
;H_-dλ∩0IT
l∞&D≠88m
;Y(∞⎇|YE∀λ∃~↑y(≥∞⎇c"Xm⎇<≠{L]]≤h
\>(_LT_;↑$ ~<|∧
xZY,>λ→.l;H_-m⎇~→.$_{{N4
~;DX8⎇¬D≥~→/∀λ_{n]→λ→.l;C"L,(≥~Q<x;,T_{{N5+Hλ∧ ;H≥
<hλ∞|>(_m⎇<≠→/∧≤⎇≤N\⎇≥<L↑hλ_l≥H_Y$∧_]:-Nλ≥<∧∧≠⎇=∧
yC"N=;<≠T_{{N<<kB)≥]→<Ml;≠≡$(_{mnh~<d∞Y<≤L↑y;]\λ~;D(→[n-(≤z-];_<D∞≠nC!!"C"I\<Xz∧εkλ'⊗n""!∀λλλ∧αl+,Ea"""*9y(ε∃.#"@ Maclisp RefeRence Manual
∀~(~∀
∀ @@@@@A??⎇????⎇????⎇????⎇????⎇????⎇????⎇???>4∀∩@@@@@Ap∩∩Ax$∩@@Ap~∀%α↓↓↓↓αβq↓↓α↓β∂εα!∩π`≤8GJ∧∧π`h!∀ααα∧∧απe{{u⎇⎇{{u⎇⎇{{u⎇⎇{␈E⎇⎇{{u⎇⎇{{u⎇⎇{{u⎇␈AQ H↔⎇Wε*∞Mε*ε-x∞↑h≤Y.∞Y<p∩[8⊂1`%lh fA=H ↓βn+7?KJβ#π>)β↔≠xεV.B∞MrεF⎇LBε
∧
ε}NnLWαb≥f h ,6∂∩ λ-lλλXlNH@⊂⊂\2P:;[P⊂8/inteRpεAi↑↓←EEK
ifL@↓)QJAAaSMi∃HAeKAaKgKαsSπ∪L{9↓β|1β∧Q λM⎇\h∩.P:42H⊃27j≤∧ed-pair"↓]WiCQS←\@!α@\AλRAoQ∃aJAα↓SfAi!JAGCHAC@: ∧∧$~<h∞M→(⊂lNKC"APHλλλ≥[⎇~↑H≥x/∀≥≠h∧∞|Z5T≥~→$
;]→.β0v⊂≤αeprepπ@↔≠&S'∨p∧αεyH⊂${{TeD≥z~,=α:4d
8πy2CE1wg≥2s4@%nt f@=` β3∂∪∨*∞:G.8⎇≥.,<kλ
≡nC"AP@∧DVK←⊂7PVVVFO⊂1r9βADPλ⊂⊂>εB∧@P⊂λ⊂:εEαDP⊂⊂λ+αE∧BP⊂⊂1Xy
λ There are @QQeKJ↓→Sg`↓@@.l0
≥{\h∧<|sl=8=→,D≥z5
∧_{`↔≤p¬s* cons, cab0@AC]⊂AGID8~∃)Q∀@AMk9GiS←8AG←]L@AG↑αk';-→β'S~↓βS←zβπK∨,k↔;S~↓β';&yβ¬↓∧≠?;MX↓!E↓αq↓I%αβ∂π9ε∪∀4+>+;↔K∂#↔⊃β↔Iβ↔[∞cWπSNs∃↓β≤¬vw~ε∀β∩Jd∧¬&FTg.v>M⊗}r<↔∩π,↑G/⊗n4π&FT6∂∩=voε⎇lVw Q-v2α
≡G~α≡&?.\Yg"b∧⊗v"∞Mε*αnVv∨M≥vrα<G∩α∞,W'∂-n2π&Tαε≡N$αε≡⎇↑ε}v]nBαε|dεO'1Q&∂⊗}]V.wEaPPh$∧α∧}lTπ'OTε}2∞>G↔.>NW⊗*D'.NNDε␈/D
v2ε=⎇g≡/5Dπ&F≡DεO~∞↑6."∞≡VO&T
v7&]eBεO4∞FF(Q$&fO>Eb∩αλ∀αεf≡>BεO4∩απ-}rε}d
v⊗V\>G~`≥|bε∂,-↔'⊗≡/∩εf]lw&Bd∧α∧
M↔∨"∧
v2πM∞&.(Q.FFNl}2β
Dε"bε≥lBβ~
≡2ε≡⎇n7'↔\>F."/∩αα=vw~ε∀αF≡⎇n2β∩¬6}w4ε2εv≥E∩JK4
fNb∧
↔~ε⊃Q'∨ε\=⊗∞b≡F}j∞Mε∂"
≡2π/<\Bπ&t
V∂⊗4∧π&FTVv"
|bε
M↔∨"d∧¬&FT∞7'↔\>G/⊗T
v2α∀εfO>APV≡≥dε⊗*M⊗∞?,≥Vn.D↔≠PQ!PPH∃USrεt¬RjjWdεzαUURkr
tαjjUWbεv≥APPH∀∧ααπA∀ααα∂A∩αα∧∂@hP⊃∀ααα∂A∩αα∧∂@Jα∧∧π`h!⊃∩αα∧
`Jα∧∧¬0J∧∧α¬0Q!⊂Jα∧∧βλJ∧∧αβ⊂∀∧ααβ1Q hR∧∧∧7⊗⎇Tπ&F≡4εO"<⊗rε,Tπ≡.]dπ&F≡Dαπ&Tε≡∂$
v2ε∀
FO∨D
↔~ε≡N2ε6≡.7"α]F.n]nBbπM↔ h.Mε*ε<N"ε}d∩εf≡>BεO4∩εf≡>Bε}d∞FF*]F.n]nG~ε≤nF/∩∞Mε*εm≡'∨"D⊗v"∞Mε∂"∧∞FF*
M↔∨ Q-v2εmtε.f]\Vw'4
↔~πMRπ≡≥\Rε∂4
fNbaQ hR∧∧¬&F≡4εfO>Dε}2ε∃Bβ∩D⊗v"∧ε2ε≡}]F"ε,Tπ⊗/∞,W≡.nLV"ε≥dπ&FTF␈"]mw&∂M≥vrα∞↑6."mw⊂h!Q hU≤v*β∃V∪H⊃∀ααα∧α3
k%a⊂HJ∧∧∧n∂,=αβ~Dε∪K;⊃Q `H⊃⊃∩∧&≡L∩∧}-,V∨'1Q hPQ,6}w<Z2ε∂4∧αC
¬dαC∩¬dαC~¬dεvNE∃∩JR∧ ε␈>↑lW∩b∀εn␈,Tε≡}nlVvN]nBεv}L↔&N⎇a⊗6␈$
FF(Q"π⊗NnLV"π,↑π⊗/<Yg&∂M≥vrε|dεfO>N2εF≡4ε⊗.]dε&.m≥f.#$∧π&FT∧&fO>EVv␈L≡FN}d$αC
ε λε5+C"I≡λ~<d;⊂ wH⊂87y\tq62H:7P4_{2P0Bt8q9~r⊂7sλ:42P≥;wP⊂≠7z0z~ww9P≥t4qtλ4yP⊂≥yrr→7yεE≤z9:q]8y2yH;t4qZ⊂0y2H0v6w\z⊂0P≠4yz⊂λ2|1r\:⊂:4_z⊂:4→|P2g→⊂4w⊂_w⊂0z≠vP⊂7]42y⊂≥40wεB74v↔λ⊂#7yλ2|0v\62V⊂
P↔⊂
!⊂↔⊂
!P↔⊂⊃∀TTP_pw⊂1→P92x≤2yrw≥2r⊂0\P∀ P⊂⊂!P↔λ"∀WεBεE⊂⊂λ P64\z⊂77]⊂1ww≥0tw4[3P0w≡P⊂2v→vrw:≤P4yP≤2y32Xz6<P≠2spvλ0w2⊂λ392x]rw:6≡P:yrY↔εE*~4yP=→y7Vv→w3z4λ64yzλ4yP4Y2w:4Y4rr⊂≥tz4⊂λ:42P_z7vP≠4v↔⊂λ$z⊂6X|P12H:<x2Y⊂⊂4wλ0yFE→tz42\⊂74vλ7y⊂∀
WεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεE&Xy1t⊂V⊂_\M\DDDH⊂⊂⊂⊂∧XVY↔αDDP⊂λ⊂⊂⊂⊂∀0srPVXXFBβ∧DDPλ⊂&pq[4yx⊂∀2s2y→w1rP∪pw:p[εEεEβEεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεBεEεE∀0srPTXY∧BDP⊂⊂λ⊂ XVL↔∧DDH⊂⊂&p\1t⊂→K⊂_\[NFEβ∧DDPλ⊂*42H!0ytXP qz~ww9P≠s⊂&$ThεEεBεEεEβE→W⊂λ*42P⊂0ytqH qz4[w9P7Y⊂&$iTεEεEβE→W_H⊂!4w→4w3P≠s⊂+0\4pq6→yFEεBεE⊂⊂λ*42DX0ytqH⊂894[tz4{→yP7sλ⊂897Yy0vvZw3P⊂~w⊂&4\x⊂⊂0\2P⊂;_y4pq≠2yV⊂λ37y6\V⊂0w→εE3:[1z4w[9W⊂⊂⊂P;0y~pq62BtyP0[⊂0z7[tqP9↑vq7vλ⊂;t4Xt⊂40\P0P;_v:rDXyywqZpz2rλ;tz4βE4z≥H:42P≤|vq7[⊂4yP≤ptr⊂≥7P12H⊂17z[2⊂:7H:40zλ;0v:YW⊂⊂*~2P;0[:rP6X|P7sλ⊂1wz\9rP1→FE0w≡P&4y\⊂7q5→qz⊂;Z0z9wY{2y↔λ⊂*42H0z7vZqP⊂9↑vq7vλ0qz9H9tvx≠<P0yH0P70[rP⊂1≡P;t4XtεE:~2P89≠sy0vH6p|P≤2s2yλ:7P:~2P;0[:rP;Z4v2P~z⊂4yH897qYyytw→P4z↔βEεE⊂λ⊂*44\P4yP≤tvtv_y⊂:7H:42P_ww1r\:⊂7sλ;0y4Xq62yH4w⊂7]42y⊂λ897s\0vvt[3P60[3zpsYyWεE∩7{r{→y⊗⊂&~yx∪yH1ww1Yx:⊂7Y⊂:42H9qwx→P7s⊂≠0vryH4yP9]q:6<H24s3→y2w:λ397vBz40zλ7sεE≠wyz⊂λ127qZTyz9≥qz:y→r⊃⊂&_w3zpYryW⊂λ z⊂ H3t{2[⊂6wvYw:⊗⊂_P;0y~pq62H⊂6p|H0qz:Xv6<FB40{"H9r{2\0r⊂1~w24w→yP4gλ2|4y]2w1bKα Only the moSt reCent, or current binding0~∃GC8AEJAUgKH\A/QK8ABA]∃nAES9IS]N↓SfAGIKCiK⊂XAiQ∀AaeKYS←kf↓←]JA%`
βC/≠#↔⊃αβ?;Szβ∧4+∨#π∂-pJ'Qβ>K3 ",V≡}\Tε∞≡<Xn≥8[⊃$9x:-d≥z→-d≥~→$X;Y
≥Yh∃m
8z∞≡<→4Nrr2rλ4z⊂ )pε~∃e∃[←mK⊂\@@A
aKCi%←\AC9H@Ae∃[←mC0AWL@↓ESMI%]OfA%`
↓β∨K;∂#⊗{;'k, '←'&AβOW↔∪?WSNs∀4≤3 &≥lrααα_;LD≥z5
∧λ_q.∞α0tgλ9x2`"ia`_↓A@∨Ko→β∪↔≤≠C',!↓β(¬F␈:∀mtλ≥~
≡h≠9,=_;Z.vBEcorreSpknds cl=`∂πI∀απ&tαFF*∧∧&f@xx;∧∧≥X<M≤8[⊂∩\β" C=]GKaβ!↓β?2↓β/SF+@∩π∞-v >X;;-≥Yc"ML8π#zXpπes. Howafe@HXA Sβ≠A↓β_¬fw≡≤LW.hλ⊂~~0r 4here is Onhp∩@↓←]J@↓mCESα&T
vF|y#!10 nding @ QC@:∧|W4ε⊂90]42y phan sev@∃`π@l↑_0 0]2@ F¬aSCE1KfAo!SG@AαCπCC,¬`O&t ε∂6QQ'εFT
6∞nT f∞nUa∧∞w∀L\β2y2[1rP⊂≤0π A↓mCESα#∃bβ↔[⊗p∧ε.Xπv@ oud`&αK∪∃↓∧εFF*∞λλ.8∧icUla`$~)ae@??∪π%β>C'∂↓∧∧v∂6Tλ
.↓⊂4`∀s current S]ISαs⊂~λ→y.∞h≥~T_⎇ →≤αeftbi`≥I%]NAC9HA]←β!β/:(h#∪↔&+Cnα;Y,D_PPλαscO↓AJAeJαc↔Md λ∧ =λλ
≡h≤⊂↔\βsable to pπ@'↑YF∂&Tλ
(≠`:~2q⊂⊂_ww!`$pp o_∩+N≤¬gε*
p→D∧≠X;,↑h_↑$∞αy`)@9@
↓β⊗K;∪'v9β∂?w#↔cQ∧εε}Nβ]→.9P whicH abe desc@ISEKλαβ &∞LZ @QJ≤q,T≤_9lTλ# →
∀WεEα@
Un`→S-JA[C9rA←I!KdA↓`∧⊗v?\≤v/~β∪
≡|λ⊃
|<h∪M}λ_p↔[q0 ne phe conc@∃a`∪M∧{⊂∩α
l⊗n(⊂;LA P @4orage,∧@A≠¬]rA↓d;∨W∞;↔Mβ∂≠G?∂H∧↔&*∞⎇↔&B⊂λ∞l8Z0,-α2P∀_P70vYTP0@ piec@⊂@A←L↓ci←e¬K@∀Q
M
8z⊂λ1pw hcld kne obbe@
h@A←α1β¬↓∧εε∂⊗M_λN]_0 pqpe, su@
PACFAB@@α3#>_¬~-lh≤∪m≥]β"Mn8ε`"ep∧\@AQQJAm¬aSCE1JOfAYCYkJ↓aKg∪α#↔M↓∧¬⊗rπM
↔4≤⎇≠n0srWλ⊂ r is dhen I↓5aP∨O≤K#∀hS∪?$λ
∞⎇h≥X.
88[↑h≥≠d∞Y8;
∞(∩_.l(λ]
(≤x-\αQ6alue; kne coul@⊂AQCLα)β¬α∧0n∂(∪qD∞~→#!∞β0v*YP7s⊂_w0∂ther @EUhA]←β!βS#*βGπ\TεNεYnFN≡≥Dε}⊗,X7"pQ!PBα∧
FF*∞=↔π8=~-⎇H~ 7λ&4yxλ own storage. Binding is
simply an association between a variable and a value; consequently there is no
March 3, 1979 ∪1-3. Page 1-13
Maclisp Reference Manual
reason why two variables cannot have truly identical values. Similarly,
erasing the binding between a variable and its value does not destroy or throw
away the value; it simply breaks the association. Of course, if there is no
other use for the value the storage it occupies will eventually be reclaimed by
the system and put to more productive use.
Often these processes of creating a new binding of a variable to a value and
reverting to a previous binding are referred to as binding and unbinding the
variable, respectively.
A slightly different way of creating a binding between a variable and a
value is assignment. When a variable is bound to a value, the previous binding
is saved and can be restored, but when a variable has a value assigned to it,
the previous binding is not saved, but is simply replaced. Thus binding may be
regarded as creating a new level of usage of a variable, while assignment
switches a variable to a different value within the same level. For instance,
a subroutine or function may bind a variable to an initial value when it is
entered, and then proceed to make use of that variable, possibly assigning a
different value to it from time to time. The initial binding of the variable
establishes the (temporary) ownership of that variable by the subroutine.
Due to the subtlety of the distinction between binding and assignment, some
people have proposed that assignment be eliminated wherever possible. The
Maclisp do function can often be useful in this regard.
There are several program constructs by which a variable can be bound.
These will be explained after forms and functions have been introduced.
Page 1-14 ∪1-3.1 March 3, 1979
The Basic Actions of LISP
3.2 Evaluation od Forms
The process of "executing" a Lisp program consists of the evaluation of
forms. Evaluation takes a form and produces from it a value (any Lisp object),
according to a strict set of rules which might be regarded as the complete
semantics of Lisp.
If the form is atomic, it is evaluated in a way which depends on its data
type. An atomic symbol is a variable; it evaluates to the value to which it is
currently bound. If it is not bound, an error occurs. (See part 3.4.) A
number or a string is a literal constant; it evaluates to itselF, The special
atomic symbols t and nil are also treated as coNstants. A constaft can also be
cReated by Use oF the quote special →←eJV↓iQJAYCYkJ↓←L@QEk←iJ↓pRA∪LApL~(~∧@@↓∪@→β&C∃↓β4{C5αLε2αε∀≠
≡⎇λ∧
=_hM<\p~αpr2vYw:⊂ 3peciFies the Operation t`∞AE∀~∃aKβ∪⊂⊗←-\V"b∧λ⊗v"
~G4λ≤Y-\8;Z-lh→3]9;]∞P⊂9h→qts,H0y3z[p¬`≥iL@Ai↑%aQC@ ∧ε␈ε↑,↔&N⎇a`hTiybn∂MyVN~hn0¬s @
←[JAαK9βS>yβC_λW6Hλ∀n8z8-D→S`→~yP@]QSGP↓S]GYUIJAi!JA]Jα≠↔OO∂∪d4↓∪?∂K∞k7'hpλ∧
|→0→_z4wg≤P⊂9jXt⊂⊂ \P⊂0y\tsw6Yw:⊂⊂_w2⊂⊂_ww24]4sw0[9R⊂_w2⊂#≥w1z4[wαEreberences, if ]QSG⊂↓iQJ@@?XL≡~;sD∧~<h∀λ⊃P~[1z4`/n which IpεACεεfN\@λ∧∞≠h~~2@
MaKGRα3'π⊃αβπK≡αP,]]_kA~~≥4d∧→]0↔_z4w@.al c@9[a←G!iSO\α↓β'MαβS#∃αβ'.M
v"α/∩πz∩ 1Z¬∃↓∞&}|X;.P0`∩e be@Rαc@"π↑∧ε␈.@L⊂80y≤9P⊗@ as dipπiS]≥cS@OF+⊃β≠⊗{5β∞¬p≠.βyt@tiof 8⊂∩εL≡FλHαP @4p¬`↔∂'+C↔Mbβ⊗|H⊂∩≡0p
p1J@9↓∧c'O@Hg]X⎇~-⎇\h⊃[y12`3pknD↓GY←πα#3Eβ&y↓βO,∧',πzz4[2yP (nλ
+|εFF. λ∞0∂g@e¬[[@'v9β&≥lw.∞|Pe@∧@
A↓@≠@.βP`~~ww⊂⊂~p|@ "e e@Rβ##↔Hαβ¬βC⊗K7OM_
LT≥z~,≥λλ⊂∀\β diIKGiYβIβ↔b,∧'∂&≤-F*α/∩πελQP@,εpqd~w2V⊂λ1pv,e`λAαα↓βOW↔⊃↓#OF{@↔λλ∪≠y⊂⊃9]q97`5ti`≥
λR@⊃↓∧¬w$_ λ↓8¬`≥↓_∞FN}d∧ε&.i⊂L\α⊂1<CE1w`-p`∂gSβ#'?9αβ?2∧λ N↓w1z4[w9P⊂_w2⊂⊂≤βpeC%CX@@α3?K↑5Bαε8≥Ff.D∧ε∞r∧λ /∞≤Hλ¬∞z∪`9≤∧ f@9`λhα@⊃2↑892`3q`∪@?pq∩↓(∪;nz⊂9`5brs Ape @EUSYhAαC9βSzβS#∃∧¬F∞vx¬0⊂Yp¬, chARβ!β'MαβC/O≤¬⊗⊗→(∪≠y
@∧A`↔∂,ε O&tλm⎇]Y →≤∧ hi@L∪@↔c∧ε'4~;]
T≤⎇0⊃≤αs @ rAkgαK;≥β&C∀'∞x¬WεNβ→0→λ∀9r@$ parpλ@H≤α@$
SFK@~ε|≥⊗w~∞8\αr!nd c=SaCFβ#;↔O~βπQβ_{ .(⊂⊃@/pπhA∩αqβ∪↔↔+≡z;YdY8=∞↓y2yWαA
Thdp¬J@@αK@~α∧λ,L~1~-⎇X;λ∧{{4
>~0~≡P⊂12Xpzy`$ sp@∃GCCXAM@>ε-W4λλ⊂⊂\αe ¬Gikβ1P∪DQ ~Zx62`-ende@⊂ACFAαC∩α∞Mε/J∞|G,(⊃@:[1z4@.l re→KeK≥
Kf@9α↓αS"(ε&*ε_∧h∀≤|⊂∩Xppv∧≤∧q`E o`4P∞7.⊗ λ@Xv62`$ a`≤Aα3@∨∞(∧@⊂≥t4q`( ic @U`∂.@→M↑H≥~
≡h≤~\αpo@&ε! 2αλ≥bε6>XλN⊂4`∪ permipte@⊂Aa↑~)P↔π8 (≥\ ⊂\αb`∪'∪πKd¬εw→<\∞=_=
≥yHλ
|β⊂ )↓Q`
βεε,w.n]jBπ∨λ 0⊃↓i`
@'_∧↔&Nβ{@⊂λ0∧i@&π!1β'w≠C↔π h ⊗yHλ↓0∂ll=kS@:∧pλ∞↓42P⊂≤βtandard↓A`>8 2≤¬re u`ic ASF@↓IK@O_∞&N⊗X@λ,8ε7@7(@@A%h∪@&α4ε∞g=qP@.≠p @3ib`→J↓`∪:λLV-8π"Pλ0P9@0ecial f`∨¬4@AEJβπ9α(∂ππ∩@
M
8r⊂λ4qP 4he`≤@α∪π33,∧Bαε⊂→L←≤≤@↔α@
MOM`A←L↓aQJAα∪WπH
⊗Zw⊂9x→qtpvλ30∂@%5`
βεα,RεF≥lFf.@n8z0⊂[4∧`∩Aα∪eβSF)β∂?oβ'3↔⊂q↓αSF+d4∂∪∃β∞¬p≠.
9→1∧<h⊂~~2P0x≤90∂` ¬∪'πS*β∂?∪*β@⊗∞MG$≥~_-d_8h∀_p;
∧≥≠h∞M→(⊃Nzq1πβE
@∨I!KdAieaKfA9H ↓β4εVv∨M→vw~≡&*εL∧⎇,.Kλλ∞⎇~8z∧
<h∩N≡⎇α0$∞⎇8\D∞z=~∧∧_(≠_y0 able
λ
∃≠¬aGP@LX@br\r∩α∩@@@&DZf\D$∩∩@@@@@AACOJ@DZbj~(_∩∩∩@A≠C
YSg`↓%KMKIK]GJ↓≠C]k¬X~∀~(~∃]k5EKd∪=L@ACIOk[K9ifX∪1Kqad0AoQS
P@ASL@AC\AKqaHAoSi @AB@↓mCeS¬EYJ@↓]k[E∃dA←L4∃CeOU[K]iLXAC]⊂A[CGI↑X@A]QSGP↓SfABAisa∀A←LAMaKGS¬XAM←IZ@Ao!←gJAIKgkYPASf@↓]←hA∧~∃mC1kJXA khAC9←iQKHAM←e4vAiQ%fACY1←ofA∧@Eie¬]gM←I[CiS=]CXD↓isaJ↓←LAg∃[C]i%Gf\~(~∀@@↓π←]g%IKdAQQJAM=aZ~∀4∀∩∩∩@@@@@QA∧bAαd\\\A¬\R~∀4∀~∀@A)QJ↓KmCYUCi←d↓MSegPAKqC5S]KfAAi<AgKJ↓SLASP@ASf↓BAMk9GiS←8AoQS
P@AI∃MS]KLAB~∃MaKGS¬XAM←IZXAR9J\AC8AMgk dXAB↓MKqaHXA←d↓BA[C
eF\@↓∪DAg<XAA%bAG←9gkYi∃HAC]⊂ASh~)IKGS⊃KfAQ=nAi↑↓ae←IUGJAB↓mCYk∀X@@A%LA]←PXAA5kghA JAC\↓←eIS9Cer@↓McMGQS←\\A)QJ4∃gkD5MWe[LAαb@↓iQe←UOPAβ8@ACe∀AKmC1kCiK⊂X@AaI←IkG%]NA\ACeOU[KMiLXAC]⊂@AiQ∃\AiQ∀~∃IK→S]Si%←\A←α1α βM→βπCεc'↔⊃¬#=βSF)βπK?+7↔nN2rα¬λ↔πεM≤6∂&≥⎇bεO4F/≡>-⊗⊗.D∧εNr∞Mε(h,mvff}⎇⊗v:∞8V∨&≥⎇brJ∧
FFO4∂⊗N.LN2αε∀
&/∨]JBαα∞=vn
M↔∂ different from an atomic symbol which happens to be the name of an
array; such an atomic symbol is evaluated the same as any other atomic symbol.
Page 1-16 ∪1-3.2 March 3, 1979
The Basic Actions of LISP
α3.3 Application of Functions
α When a non-atomic form iq evalqated, the function speCifaed by That Fore iq
combined with the abgumentq spEcifiEd by thad dkrmtk produc@∀AB@AYCYkJ8@A)Q%b~∃AI←GKgL@ASF↓GCYY∃H@ACAaYSG¬iS←\lAiQJAMk]
iSO\%SfAg¬SH@AQ↑AEJ%CaaY%KH@AQ↑AiQ∀~∃Ce≥k[K]Q`
(∀Ph!↓↓¬##∃β0¬↔.⎇λ∀nL<λλ
≥H_<∞
~8x.M9{@
≡h≥≠d∧_{`↔≥2y: phe Fqnction-specif@%Kd@AαK;C=∧⊂hVnXL>~;p↔_v⊂⊂ %xpreSqa`∨\$Qg←[∃iSK
β→↓β∂x¬f'8 t`.elq @
CYYK⊂∪B@A→c]Gi%←]CXAMOE4XRAα4∃Mk≥
iSO]¬XAKqAeKgg%←\ARβ→β¬αd¬↔>λ≠p⊃~2qz≥t4qdλ4yP)]<piZe` sO that Licp can kno@X~∃@#|εrπ&tλ↔πεO∀εO"∞Mrε∞,}Vn∞β]≤edλ∃~T≤Y0⊗→yP3 /p∧AiQ%bAG≡αs[↔K_¬⊗}r∞⎇⊗f@λλ⊂LT→→4l>X∧q2Y∧@
after @QQJAieaKfA=H β≠,s∂S'|sπ1β,πππ⊗↑:6N}n4εF∂lTε⊗.]`λ←≤≠⊂⊂Zw2r.
~∀@A)Q∃aJACIJAECMSGCYαceβS>yβC_∧⊂∩≤β of d¬`↔h0
≥{X;∧>≤⊂→→yyt`/n. A ` C[ IB[JβCCK↔≤ε6N}aQ&O~⊂λ↓8¬`≥Fπ#'?≠∞aβ↔c∧ε&/∨=⊂Md≥z~,=λ≤t\z9R,↑h≤p↔Zp¬ vApiables which @¬aJAi<AEJA ←k@: h ↔εt
(_<L↑91 ↔≥9Rand s@=S@∃α0¬w,αyP⊂≥t4qdλ0y2P≥0∂ be evalqateD, ONe would ∃qaKεβ $SF)β≠x-W4≥≠hL<⊃ ↔→⊂⊂7gλ842P≥0q4`!b` Kf8∪!QJ↓mC@3αPBαε|dπ&FT F∂∨Dλ M}XεP )pεβKgα+⊃βεα1P@.α42P≥0p@*α)β>dλ
(⊂<∞
α4q`]4p∂n↓←DAi!JAYC5EIB[∃qaeKβ≠@≡↓8πw. A`≥r↓aeKεα#∪'h `⊂_ε`∂e[LACeJ4⊃aeKβ≠↔+Qεπ∂⊗YH∞$Xπy p QKRβ⊃βO'&)7.l` ,>≤kB(∀≠_;,,_+9/∞≤Y0→\β`∪@?p∧ε@LβwuyH44urNα~∧~(∩α@@@@@"`∧⊗n⊗L⊂λ¬(⊂⊃ c dR4⊂λ$∧Jβ⊗|[ _BE λ f`∨e4d∀(HH%β~¬pM⊗h∧FEα@
Here a _@Aα⊃1β
bβπ;⊂αβ⊃βε⊗)↓βSF)β@6≤∧Z,≤Xε2`3 po JAE↑β+3⊃β&y↓βSF)β@6≥@
,↑hλ∪l↓⊂:42CA0q3]vrw:≤β λAεα3&X@λ∧∞α42P~∧a`≠↓⊗#¬.¬X<M≤8[∩\β ≤@@↓∪@→α∂!β¬↓∧6/⊗L≥⊗bεX`⊗Yw:⊂⊂≥42P #qrbe@9`∀,-⊗v&≥lrεyH⊂⊂H8πa@f↓aQJAα{;∃α_∞&.∞LXBε↔∀λ
<h⊂⊗_vq20Kp|8 2essi891αλ∧π>␈]H ∧Y" →Xpr4m
∃E∀A@∪πn∪∪¬7⊗{W;⊂p∧αα∧9@ ,≡Xε 9 thiC ha`≠↓⊗#¬n←∞πε/>8
-⎇Hλ⊂∀\β a→`↔;∂&K?9↓∧εvFN9λ≤xq 8≥9FEfour¬`∨Wn+;@'5`λ∧
~⊃(≡≤∪⊂∀↓aadi@9XA←L↓iQJAα3G;∂&K?;πbβ↔cC⊗+@∨≡≥xD∞≠h3≠zq⊂!pguments
pr`∨IUG@↔M∧∧∩π⊗≥JV*ε(∞(↑X;∃,≡~;YdYx[&∀α⊂:4→w⊂3/p¬RdX↓C]HAβ##↔→∧∧f␈⊗β Wλ⊂*42H8εalue of
fo`%4fASF↓iQJAYCYkJ↓←@→β&C∃β←F{3∃β0¬w,+Hλλm|H⊂∩↑0p
ple( the valu`
A∨α1βC#*ββ?-QP@H!⊃∩αα∧¬αFF≥\&&
¬∩ε∩∀λλE∀h
¬⊃"C"M≡h
↔λ⊂*42H3:g1]4sw0[⊂⊂2`8pres@MS←\AUcCHAαK@~ε⊂∧π6/-∀π<∧p
pLe one shiCh acc`AiLAao↑4⊂π?+7.β]≤d8π $↓`↔S,ε&w~∞Mε*π<PλM⎇Yλ⊂↔[2WεEβ@
I`@A]J@AOIC]h@↓iQJ@↓KqSGQK]GJAWL@↓B@A`IS[Ci%mJ@A¬IISi%←\@Aα{C↔K∂#'?9b↓β←#y≠∀4+5+;∂SL¬vv∞β⊃/∞≤Y4n≤8πw~p|P "e de@MSG]CQK@AEd@VH↓β##↔9∧εFF*∞l⊗g9(≠l⊂:42H33y6CE
λ αMapch 3, 1979 ↓ ∪1-3.# Pace 1-17
Maclisp Reference Manual
α
((lambda (a b) (+ a b)) 3 4)
is 7. Actually,
(+ 3 4)
evaluates to the same thing.
The second basic type of functional expression iq the subr, which is a
program directly executable by the machine. The argumefts of the fkrm are
conveyed to this program in a machine-dependent manner, it performs some
arbitrary computation, and it returns a result. The built in primitives of the
language are subrs, and the user may write lambda-expressions which make use of
these subrs to define his own functions. The compiler may be used to convert
user functions into subrs if extra efficiency is required.
It is extremely coNvenient to be able to assign names to functional
expressions. Otherwise the definition of a function would have to be written
out in full each time it was used, which would be impossibly cumbersome.
Lisp uses atomic symbols to name functions. The "property list" mechanism
is used to associate an atomic symbol with a functional expression. (See page
2-52 for an explanation of property lists.) Because the binding mechanism is
not used, it is possible for the same name to be used for both a variable and a
function with no conflict. Usually the defun special form is used to establish
the association between a function name and a functional expression.
Thus, the car of a form may be either a functional expression itself, or an
atomic symbol which names a functional expression. In the latter case, the
name of the "property" which associates the symbol with the expression gives
additional information:
A lambda-expression is normally placed under the expr property. This
defines an ordinary expr.
If a lambda-expression is placed under the fexpr property, it defines a
special form. In that casE, the first lambda-variable iq bound to the cdr of
the form being evaluated. For example, if foo is a fexpr, and (foo (a b) (c
d)) Is evalqated, then fOo's lambda-variable would be bound to ((a b) (c d)).
A second laebda)variable may optionally be included in a fexpr( It will be
bound to A "bindingAG←]QKqhAA←S]i∃dDAi<AiQJAG←]QKqhA=H βSF)β↔[∞cWπSL{9↓β|1βS#(h+≠?⊗i9↓↓E≠↔¬βε∨*⊂&&λ→[n⊂:42H22z0Zv9P'Yα biNdifg↓G←]i∃q`⊃β∧{';S-∪@~J#"APT_9lT+$'↓ "(∧∧λ∧l%VkHb↓⊃(λλ \<Xz∧εhε_N[\FEα∧DDPλ⊂*42H!0q`)c Ac@QS←]f↓←DA→%' ~∀4⊂⊂∀ α↓α'→∧ β#πn∪∪¬7,πππ⊗↑>6N}d∧π>OMλ
⎇Y(∪≥8Y_%↑X8Z,≤Y→(∧
<h≤
L8y1∧∞9Q→.⊂⊂:4→P6pq\0π
@AeWaKIirXA%h@AI∃ISMKβ→βS#*↓↓↔∞≠K:$λn8z8-D→[`→~P⊂6r[:4wg→p⊂0q≠{2W The h C[ IBZ~ the fsubr property, it defines a special form. A
subr-object under the lsubr property defines a subr which accepts varying
numbers of arguments.
There are some additional refineMents. A lambda-expression which accepts
varying numbers of arguments, called a lexpr, looks as follows:¬
(lambda n
form1
form2)
The single, unparenthesized, lambda-varaable n is bound to the number of
argumefts. The function arg, descpibed on page 2-12, may be used to obtain the
arguments.
Another property which resembles a functional property is the autoload
property. If Lisp encounterq an autoload property while searching the property
list of a symbol for functional properties, it loads in the file of compiled
functions specified by the property, then searches the property list again.
Presumably the file would contain a definition for the function being applied,
and that definition would be found the second time through. In this way
packages of functions which are not always used can be present in the
environment only when needed.
An array may also be used as a function. The arguments are the subscripts
and the value is the contents of the selected cell of the array. An atomic
symbol with an array property appearing in the function position in a form
causes that array to be used.
If the function-specifier of a form doesn't meet any of the above tests,
Lisp evaluates it and tries again. In this way, "functional variables" and
"computed functions" can be used. However, it is better to use the funcall
function. (See page 2-13.)
There are some other cases of lesser importance:
March 3, 1979 ∪1-3.3 Page 1-19
Maclisp Reference Manual
There is an obscure type of functional expression called a label-expression.
It looks like
(label name (lambda (...) ...))
The atomic symbol name is bound to the enclosed lambda-expression for the
duration of the application od the label-expression. Thus if name is used as a
functional variable this temporary definition will be used. This iS mostly Of
historical interest and is rarely used in actual programming.
Another type of functional expression is the funarg. A funarg is a list
beginning with the atomic symbol funarg, as you might expect, and containing a
function and a binding context pointer. Applying a funarg causes the contained
function to be applied in the contained binding context instead of the usual
context. funargs are created by the *function special form.
An expr property may be an atomic symbol rather than a lambda-expression.
In this case, the atomic symbol is used as the function. The original symbol
is simply a synonym for it.
In addition to the variety of application just described, which is used
internally by the evaluation procedure, there is a similar but not identical
application procedure available through the function apply. The main
difference is that the function and the arguments are passed to apply
separately. They are not encoded into a form, consequently macros are not
accepted by this version of application. Note that what is pasSed to apply is
a list of arguments, not a list of expressions which, evaluated, would yield
arguments.
Page 1-20 ∪1-3.3 March 3, 1979
The Basic Actions of LISP
3.4 Special Forms
This section briefly describes some of the special forms in Maclisp. For
full details on a specific special form, consult the Function Index in the
back.
Constants
(quote x) evaluates to the S-expression x.
(function x) evaluates to the functional expression x, There is little
real difference between quote and function. The latter is simply a
mnemonic reminder to anyone who reads the program % including the compilep
- that the specified expression is supposed to be some kind of function.
¬
Conditionals
Conditionals cOntrol wheTher @=`A]←PAGKeQCC\A→←e[f↓CeJA∃mCYK¬iKHX↓IKaK9ISMN4∀@@@A←\AQQJ@AIKgkYQbA←L↓KmCYUCiS]≤@A←i!KdAMα{@⊗<k@∧
~≥<a≤Yx
4λ:42P≥0pe¬ afd↓iQJ~(@@@@↓c@'∪*β↔≠(∧7'~
x D∞~→(={Y~.M8πw0[⊂3'@2i cAn be Cont`%=YP∪⊗ ¬`hPβ"B¬{{Q∧¬≤≤Y,M8x=T→S`→~XP#/p¬Rd\αq1%↓GβC↔∪L≠πS∃∧3?KP∧ 4πrm∩(∧\\R8X\R~(~)↓α↓↓β'~β¬β∨,¬f/⊗≥Dαε≡⎇lFO&≥xL≥λ⊃P↔↓p¬@∃9ααS#∃∧c'OS~↓β >dλλ$∞≤Y1
≤x9→$8π $Ag←[∀AM@?⊗kD4λα↓↓↓β∂∪∃β∞∧≥F@L9⊂⊃Z0ry`%pε@9↓¬##∃α_
vv" _d9X;∞\=→1∧↑(⊂⊃≠w9t@$er`∪]≤A`∪#*↓β∂3∂+@≡8 P /ne~∀@@@A r@A≡αs∃β'p↓βC#*β?K∪,ε"απMWJε_∧Y$∧≥xZ.Nα2`.8∪!QJAaeKα#'∂εαLRεyHλ∀λ⊂`⊗_zyrP~yBE⊂λ⊂⊂⊂%va`→↓(S↔⊂bβπ;⊂∧¬ε!=~→$∞Y<p~Z8∧ @Rβ→β@'(¬0∩⊂⊂:4_z⊂$@s, anything `∂iQ∃` ↓β&Cπ9α¬mεb`Q$ααα∧≥
8π⊂⊂≤42P&or`≠fAS@9∧εFF∞@λλ=_0~@se a@e∀@AKmα3@._¬→,D_;Y∧∧≥~→$y{@∩λ⊂4`∪ `
S@:¬⊂m9β"D∧λλλ∞|9~≠N≡λ⊃ ≤_tp ning the re@5C@'h
7_β c@XεWO↔~q↓α≤dπεFTL↑⎇;~λ4qP .ot Q`@.UDεJY+C!⊂⊂⊂⊂λ4s⊂ )p i@&↓]S@0b↓β@&λPD∞α42P≠2|: cla@jπ≠∃β&α4αε/≥VNvX@λ
≥H≥~T≤x;,T≥x>%@∧P$@& a`→X4⊂ ↓↓α↓β@&Tε≡f_¬ 9YyP y→P2|4_zyz2Y⊗⊂:4_z⊂$@3 noPAC@9∧W.Xπ`∩8∪!QJ↓mC@2αPRεyH⊂!≤{{Y∧
<c"D∧λλλ∞M→(λ∞l8ε ∃∧ of the hactAM@>⊗iβ'PL+[πH¬ .L<kλ∧∞z~ ⊃Z⊂1w@uld Be nil i_AU@<hQ↓↓↓αβCK↔&K∂πS*β'Mβ'∪W*@λn⊂:42H90v*YP⊂7@& a pRe`ic@¬iJARα1βC#∂!βCK,#'∂π&(''M¬#@↔∞QQ"αα∧∧ε↔∞D ε∂~
mrε6β|[.∀~;@⊂~z9P![0rybKαλ
∧~(@@@@QC@; ∧ε&@|[ _H30∂rm2 foIP∃M9pq%β↔43Gπ&+@~πMRε6|-W
ε≥`π>8xp∩\βsio@8Ak@;&K1↓β}s∃β'_h!↓↓α↓β;πbβ?Iβ&C∃β~|ε&o~∧↔⊗*P∞
=<p~→r⊂And the result is the valu`
A←_@AiQ∀AYC@∨ 4 ↓α↓↓β≠⎇∪%β↔63@.≡LV"pQ!PRα∧∧ααF|$εε␈-P$Y|[&$→[`→≠YW↔↔
P2{ [8pz2\β the formq until one is non-nil op∧AiQ∀~∀@@@AM↑β∪7M↓εK∃↓ε+c#π-≠S↔⊃b↓βπ≠ βS#∃αβK↔O.cA↓βM→↓βSF)β[πg+∃↓β|1↓βSF)↓β3∂≠Qβ≠⎇∪44)α↓↓↓β-3π3W∂#↔⊃_hP4
7∂∪∂!↓~a↓Ee;H$$%α↓↓MλiM9PHH%↓↓α↓↓↓αε∨∃↓
iID4P Maclisp Reference Manual
Non-Local Exits
(catch form tag) evaluates the form, but if the special form (throw value
tag) is encountered, and the tags are the same, the catch immediately
returns the value without further ado. See page 2-44 for the full
details.
Iteration
(prog (variable...) form-or-tag ...) allows Fortranoid "programs" with
goto's, local variableq, and return's to Be writpen.
¬
(do ...) is the special form fop itepation. See paga 2
38 fOp the details
of prog and do.
~∃⊃KMS]%]NA
U]GiS=]f~∀4∀@@@@QIK→k\@A9C[J@QCeND@ACe≤d\\\$@AM↑IZb@A→←eZ∧8\\R@↓IKMS9Kf@A¬\@QS9iKeAIKiKH$~∀@@@AMk9GiS←8\∪'K∀AaCO∀@dZlDAM←d↓IkYX↓IKiC%Yf\~(~∃eI←dAπ=]ie←0~∀
∀@@@@!EeKC,A]C[∀AhRA
CkgKβ→↓ o⊗[CQβv7∃ ¬#=β*βSgC.!β?W"βπ;⊃ε;'[↔~β∂?;'∪?1↓π#=β∧hQ↓↓↓αβK↔π"k↔[πbkCK'w!β3?␈↓βO=π##πQ¬##∃β/≠↔Iβ≡9β↔F7'≠*βπ;⊃ε≠#π;>)βS#*↓βOS∂#∃β?0h)↓↓α↓βS#*β←?Kf!9↓α>C↔9βF)β'Mπ≠πS'≡3'↔⊃bβS#∃π+O↔I∧∧6∞r8↔/≡T∞FF*.&.∞4∞Fzπ,↑G/⊗d⊂hR∧∧ααπl≥G.*d∧¬≡.T∞ε∞>Tε2k*mw∩πMRε&↑L⊗Ng4
v $_\Y,≥iC"AQHλλ∧∧
→4N∞y=λM|[*$=X;∞\=→<d∞~→(m|[#∧]=
≤H_;D<\[n$≠xpn↑\h≥
(→4N∞y=λ∞=;<≠∂⊃"Hλ∧∧λ≤Y.N<[\d
Z;D∧∩9H
mh→<N-|H≠l<⎇<\eD≥~→$∞X;≥,T~<h∀≠~<nD≥z≠n<(≤z-l{→(]→;9-nβ"H∧∧λλ~.∀≥z_.D≥~→$∞X;≥,T≠yH∞M→(→M}[(≥m};→λ
=Y(,9;H∞⎇=~≠n↑λ→<N.y=AQC"P.>z9{M\;]β!!"Hλ∧∧λ
≤l↑≤(≥L≡L(λ∞l;≥9&∀≥X<F$λ≥X-N9,KEeJ(_.>z9{N4≥~→$∧≥X;∞\<h≥
tλ≥~T≥X<M≤8[→.5C"H∧∧λλ∃
(≥X-N9<h≡Y(→M}[<h∞⎇~8z∧<Y(↑X;≥,≡→9AQC"H∧∧λλ
∞>≠|Y$¬_<\L∨(λ≤n\\x|M≡≥(∞>8\xn-<≥EeKJ(∞l;≥9%∀λ_<n=9{\d∞~→(∞l;≥9$∧≥≠h∞M→#"D∧λλλ≡\X>$y;≠∧∞y;→,>→9λ/(≤⎇,.x|Z.∞~;Yedλ∀y,T≤_<NDKN∧[|Hn<]~↑H~;Lm|[8.M;{C!$λλλ∧
{H_..X><ea"C"AQC"C!!"T_,|(+&&B""$∧λλ∧f∃,kM↓⊃"(λ∧ 8<Xm∧kλε↔-n#! ↓A""(∧∧∃~→$λX<z,4⊂8⎇
≥{\h
|H∪∩*:β"C!!"S:.<y;≠≥Y;⎇.4∀_<L≥9=→..c"C!$λλλ∧¬≤⎇_.N<h≠L≥9(λ¬]|≥~-⎇X;λ≡Y|k%∀≤Y=∞↑[\h∧
:<xl]≠_;L]⎇<h∞<X;,↑→<\d∧≠yH I4tAQHλλ∧∧≠X;,T~<h∀≠;Y-]{Z8d
X;9$[|H∞⎇_=λ
≡h≥≠dY(→
⎇Y+C!!"Hλ∧∧λ
≤n>_=≥.4≠X;,T;|∞M;{X-D_<Yn5*(≤l↑≤h≠-≡xy;
L;Y;n↑h≤_.,;9=↑\kC!!"Hλ∧∧λ∀y,T≤_<NDkMd[|H∞M→(→↑_:;∞4≠yH∞>_=≥.4_;Y∧∞|⎇_.N<kC!!"T≤L↑≥≡+*∞Z;]
≥Yc"AQHλλ∧∧
→|M≥Y→9D∂
(≤∞,=≥~-O(≤≤M≥]≤h∞M→(≥L≥≥9(≥Yλ→N]X⎇~-⎇H→→,m;Z=
≥{H
≤B8;O∃(≠yAQHλλ∧∧≥~→$=≠{-≤h≤}-\[{λ∂¬Hλ∩-l→;]≡~;{A≥<h≥.<9λ≥
t≤Y=L\;λ≤nN]8⎇∞↑Y+λ∧∞~→(∞≡;⎇→!QHλλ∧∧≤|→,=8;λm|[(
≡h≤Y.∞Y<y-n→9λ/( k∧=_kD
y9(∞<]λεeLh→M}H≥~T→→=≥;≤kAQC"U∞,8z;Lq"C"D∧λλλ¬∞≤X8lT≠X;,U(_x.↑y<h∧∞~→(n;X⎇
≥{H≠L≥9(≥
q<≤Z-nλ_(
\<|x,|(≥z]Y=Y.∧λ~=∧
<c"D∧λλλ<;≠→,D_;Y∧∞z→;L↑Y<H
≡λ≤Y.N<[\edλλ∀l\(≤_,|(k&6(→[n$≥~→$
8;↑$∧→Y8.N<Y<d;Yβ!$λλλ∧
|≥~-⎇\h≠ld≥≤X,<+C"AQC"C!!"C"AQC"C!!"C"AQC"C!!"C"AQC"C!!"C"AQC"C!!"S8.,zλeD.-g⊃""(∧∧λ∧l%VkMα!⊃(λλ∧∧λλ∀≤y(%VLc"@↓A""(∧∧⊃88mM<|λ
,9Y<L]Xy( \;]8-A C"APLkM$∧⊂Z;LM;Y`λww:2↑8⊂(7~w:2y≤β
There is a↓special type kf object called a bindifg↓G←]i∃q`⊃↓¬β?'≠&+I1β⎇⊂4O|¬V/&≥\W
ε≥`α,+;⊂∀\z⊂8'Zw:2iλ⊗⊂;t~qt⊂!Xw⊂12H8yr`$ to Reberpk a bifding c=]iKqP~∧QBαβ@≡∞@λl@⊂⊂14[24w3\β of vabiables a`≥λαβ[π∩αXW4≥z~,=λλ∃l≡h→0≤≥0s:⊂_z⊂⊂0H80q:~qzv \A4g≤z0w:⊂P":YP:7P≥42P9]0qu@ impl@∃[@↔nL↔&N⎇`λ
|β⊂&pXv4yh⊂0Pbindine cO9iKqh↓a←S]QKd4T¬↔4≠{[∂∀≥X;
≤λ≥z
≥→(⊂m⎇]_[mD~8h
l<⎇→,D≥z5
9H≥
(_Z-l~;Yd{{]←≥λ~.Dλ≠X-\αyWλ$zεE~yP77]⊂87i\tq62H⊂:7P→|4r⊂→αrom within a↓ESMI%]NAG=]aKqP@AEjβ!β/↔(εαεOD∧ε∂⊗βx
G→⊂14FB92z0Zw0w3H0P8'Zw:2iλ:7P$]↔αEεB⊂⊂⊂ H10w2~w3P![w:2|≤∧ po@%]aKdαβ'Mβ(¬↔&F↑ ε
εlX l≡~=Y$X∧t7≥vP7`2 j`∪X8@A]S0A[KC9bAiQ∀~∀EO1←ECXλAWd@@C?αβ3↔[,¬B$λ_Z-l~;Yd{{]←≥@∧∧∃~→$
Y9x.M=Y(∧Z:≠N](~0→H⊂0P3peciAl ∃mα3G∃∧{∩ε≥↑εf.XXNL9~3mdλ→→.9Y→-nλ≠9,≥X;Yd∞z~ ⊃Z⊂⊂9d≠zv2_2P7@bta`∪]∃H@A↑αs3eβ4ε&}hQ ml(λ≠l⊂⊂:4→P⊂3 /ur FolloWing Sourcepεdβ&C∃↓β4εVv∨M_mdλ→5L≥→\X-\+λλ∞M→(→N≥X⎇~-⎇C"@∩\αrframe, @QQJAgAKGSC0AMOe4@UMk9GiS←8XA←D↓iQJAMKG←]⊂AQC[ IB[m¬aSCE1JA←L↓BAMKaad\~(~∧@@↓)QJA=]YrAUgBAM=`AES9IS]Nαβ∂?;&+c@"∧
ε}NnLW↔~
≡2π&t
ε∂∨4
FF.T∞Fzα∞Mε*εnYf∨&≥⎇g_h,↑f∞b≥f"α≡πεg∀
Fzπ>V≡No∀απ&Tε⊗NlM⊗v:∧6}wL←π"ε≥dπ>F≤=ααπl≡&N∞-LW
ε≡,RαπMtε⊗(Q(W6∞N\↔&.D∧ε∞vA≤↔∨≡≤⎇fn.nN2αε≡,RαπMtε⊗*∧∞ε/⊗m}&n.D∧ε'/-≥f:α∞Mε∂"∧W6∞N\↔&N⎇dε␈⊂Q,↔πεM≤6∂&≥⎇brαλ-⊗v&≥lrε≡⎇nF/GD∞ε}NnLW↔_≤≡&*ε≥N6zπ↑<V"ε≥nF/⊗l≥FgJ∧'Jα,nVv∨M≥vrpQ*vF.d
↔"ε|]f/⊗≡LW~ε∀g.v≡,rbε≡Dππ/N4εNr∞Mε*εn]f∂⊗t∞FF*nVv∨M≥vv∞D∧ε/G∞,W∨≡≥⎇bεOAQ'>∂4vO6]dαε∞lDε
α-⊗v&≥lrε≡⎇nF/GD∞ε}NnLW∩αLW≡N⎇l↔&Nltπ&FT∧ε⊗NlM⊗v:]g6O-⎇fn.nAPV∨↑.&.wD↔"πMRπ&≥\RαVn]f∨&≥⎇bπ>≡4ε≡∞MLV"pQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ*ε∞>Tε∩k∪A⊃⊂Jα∧∧↓≠
V5c(H⊃∀αα∧\≡&≡Bε5Bβ⊗w⊂hP`H⊃~ε∂↔Dε"αjλnVv∨M≥vr∧L↑6∨⊗≡∞FN}n1PPh!Q hPQ&∩rα
∞&.&≤<↔&/1Q hPQ$αα∧∀∧ππ⊗\M⊗≡∂LTεO~∧∩ε7]l7&N⎇a↔>F≤=απ&↑>G~αmw∩π=⎇V*α=vv&≡M⊗}r∧
⊗w6⎇NfNvt
↔'_Q,↔⊗?]\Vw"≥f"π,↑G/⊗n4π"ε≤dπ&F≡Dε≡}lM↔&N⎇dεO~∞N'.*D
w∩εm≥BεNd
↔"ε≡4εv␈D∞G↔.UaPPh$∧α¬&Q⊗6}MMw>Nltππ⊗\M⊗≡∂L↑2αε≡,Rε6}$αε≡\6↑Nltε&∂L∀απ'≡W~r∧∧¬&F↑<Rππ,\FN≡≡LW_h.,W'/-a↔"ε≤dαπ&]↔∩α≡&?.\]g"ε≡4αε}d∧π&FT∞GOεQ≥⊗v&≤<↔&.D∧ε↔J∞Mε*α
l⊗n*∧
v2πMPhVn]f∨&≥⎇bbα
m⊗bε≤dαεOD∧εO~
|bαπ=⎇V*α
}FF/$∞GOεUdαα∧m}F(OM↔"πMRαεl≥V(N|dεn␈>APWπ,\FN≡≡LW~ε]lG~ε≥dπ&FT
F/'L↑"παDλ'Jε=⎇g6.nM⊗}raQ hPQ,↔&}Q⊃∩αα∧
5,∃$ε∩ε∂,qPPh$∧ααα
Mε*ε≡Mvjπ∞,V&N<≡F*π,↑G/⊗n4εvND
⊗2ε≡N2ε∂,}Vn.nDεO~∀ε&␈NLV"o≥↔∩ε}$ε
εM≡7"`Q$ααα∧
wαπD∧εN2
≡BεO4∧ε∞w∀
6NvD
v2α≡F}n≤4ε}⊗,\7"π>\6Bα≡2ε
nVn⊗↑%Bαε∀λ6F∂,≤7&/!Q"αα∧∧π∨'-≥f:b
}"ε∞d↔&}]≤2π∨≥\&}baQ hPQ*7Nn-⎇GH∀∧αα¬8X%∩β∀λ↔⊗8Q!PRα∧∧α¬&Tπ∂N\-vgα∞∞&.&≤<↔&*∧∞&/'↑-g~πD
⊗2ε≡N2αε≡,w.n]nBεO4⊗rε≡MvnN4∧π∨N\-vbb
z hR∧∧ααεm→BεNd ↔"ε≡4ε∞w≡MεNvtVg≡UaPPH!Q&6O∞↓⊂Jα∧∧¬≥,*$β
ε≡,phPβ"H∧∧λλ∃
(→@∀↑8⊂⊂8≤2r4qXz2P)→z:y7≤P:⊂⊂~s⊂4j≤β areumeNt is a fIxjum↓←d@A∧AECO9kZX~(@@@@↓←iQKIoSgJ↓]SX\t if its argument is a flonum, nil if it is
not.
bigp SUBR 1 arg
The predicate bigp returns t if its argument is a bignum, and nil
otherwise.
March 3, 1979 Page 2-1
Maclisp Reference Manual
numberp SUBR 1 arg
The numberp predicate returns t if its argumeNt is any kind of number, nil
if it is not.
hunkp SUBR 1 arg
The hunkp predicate returns t if its argument is a hunk (see page 2-32 for
a discussion oF hunks). hunkp does not consider list cells to be hunks.
This predicate does not exist in the Multics implementation.
typep SUBR 1 arg
typep is a general function dor constructing type-predicates. It returns
an atomic symbol descRibing the type of itq argument, chosen fpom the liqt
(fixnum flonum bagnum lIst symbol string array random)
¬
symbol means atomic symbol. list maans a list op a Cons. array means
array-pointer. random iq for all types that don't fit in any other
category. Thus numberp could have been defined by:
α
(defun numberp (x)
(and(memq (typep x ' fixh
kZ↓MY←]UZAES≥]kZR$~∀∩∪PRR~∀4∀~∃)!JAM←1YWoS9NAio<AMk]
iS←]LA←]YdAKqSMhAS\↓iQJA5kYiS
bAS[AYK[K9iCiS=\\~∀4∀∩∃gQaS]O@∩∩@@A'+¬H@bACIN~∀~(@@@@↓)QJAMieS]≥`@AaIKISG¬iJAe∃i`↔Kw→βQ↓εK⊃β''→βπK?+7↔nA⊗O~⊂απ∨N-⊗v:DλnM→<]m≡y#"D∧λλλ
m;C!! C"N>8\\↓⊃(λλ∧
u0TDε(_<LQ"C"D∧λλλ
M→(≤n\\\λ∞∞Y9~,<=→(∞,=≥4Mnh≥λ
≤Hλ~.Nh_<L};93ND~<h∀λ\⎇,.HH⊂↔X52qz⊂⊂4W→W⊂0FB⊂⊂⊂⊂λ87tw≥2y⊂:≠P:42H6pqt~w2P1[r2P3≠y⊂0P_wvx4[2r⊂7\⊂9|y]2vP3≥w1z4[w↔⊂⊂⊃|0vx≠2]εEβEεE(_srP→Y∧DDH⊂⊂⊂⊂∧Y⊗XWαDDP⊂λ&py1Z⊂→V⊂\[\FBβ∧DDDH⊂(92Y4qpz→yFEεBεEεEαP⊂⊂⊂
9zq9≤⊂∀3r]⊂∪qp\⊂∪yzX9∀TP∂←⊂:εBεEεE∃42P3≠v67{Zw3P0\2P0@≠wy2P≠tyqr[40w2[zyP9Yz⊂7sλ892r~qpz2\WεEεBεE2xBDP⊂⊂λ)ja)λ→⊂0y→yFEεB⊂⊂⊂⊂λ∀2xP≡⊂<TP∂←⊂:⊂~s⊂<⊂λ0w2≡P0y2H2|0q]6<P:~2P9p[rP7q~2qz⊗λ74v⊂λ7z42\9tyrH∀1s↔βE⊂⊂⊂λ⊂2xzXv∀Wλ⊂$z⊂≤t7zv→⊂⊂12H77z2Y⊂⊂:4_z⊂⊂:~4w3yH:40zλ⊂894[:⊂:4→P⊂9p[rDpy→P77zβE⊂⊂⊂λ⊂72qYyypy~v<P2\P:7P→pqt⊂≠z42y⊂⊂$wλ80y:~qzv0\⊗⊂7:[q2y9H;tz4λ:42Pλ9pvrH;0v:YFE⊂⊂λ⊂⊂72Yr⊂77]⊂12P→xV⊂0[2⊂:;[P9tvZv0y⊂≠4yz9H0y2P≥yzpv≠<P77]⊂2xWαdw⊂3Yw2y0[⊗⊂:;[FE⊂⊂λ⊂⊂0z≠vtqP≤|vq7[9P;t]4⊂⊂:~2P9p[rP89~w:⊗w_vrP0\2P⊂2\V⊂1:]⊂4z⊂~yP⊂8≠yytq≠2P;t]4εE⊂λ⊂⊂⊂6Xuw0vH7y⊂6]v:4x≠2P7q_y90|\P:7P→rw2y_z2P9↑vq7v≤P;t4Xt⊂40]2P:4→P9pvYP894[:⊗FEλ⊂⊂⊂⊂≠0vrP_:z⊂0\2P77]⊂2xWλ⊂"|0[x62yNεEεEαDT2xH∪pP∪X∀P≡←λ74vεB∧DT2\P∪pP pTP≡O⊂:εEαDT2xH∪T0P⊂1∀P T0P↔λ1∀TP∂←⊂74[⊂∀:y]pv6<JFE∧DJ2xP∀_ww9P pP∪q
P∀1w[9P∪pH∪q∀TH≡←⊂7~v⊂∀0[;p|yJFE∧DJ9rz8H<⊂∪T_P↔⊂1
TP∀2\P<⊂<
P≡←⊂≥⊂9tw_rP4zλ4yFEαDDP⊂λ⊂⊂:4→P9pvYP1wx≡P7s⊂
0P↔⊂_∀P4wλ17z4λ0y3z[rw:9KεE∧DJ9rz8H<⊂∀9Yz8P<H_[TTH∀2xP≡⊂<TP∂←⊂:⊂≠y⊂74[εE∧DBP⊂⊂⊂λ⊂22x→w24w→P7w⊂≥42P4[x62vYw:0z~ww↔∧VwzP1XwεE∧BDP⊂⊂λ⊂⊂72]2y⊂9→v<P7[⊂7:vX2y9P_2tw3H2xWεBεEεE→xzpvαDP⊂⊂λ)ja)λ→⊂0y→yFEεB⊂⊂⊂⊂λ*42P→xzpvλ892r~qpz2H⊂92z≥y79P≥⊂4s∧Zz9P0\3zvr[:9P0\2P⊂9Zvtv0\⊂∀4y[vwy8~4qTFB⊂⊂⊂⊂λ7q52Xz9W⊂
1s↔⊂→xTDj≥wP7:[q2y9H0y2Pλ2xzp[⊂4s⊂≥42|DZ0{2P≥42P9XvrP⊂≥0v:rH∀0FEλ⊂⊂⊂⊂→67w:[P4yP≠2{2yλ2xzp[⊂:7P_P34|≠:vP:~7zst
W⊂⊂*≥wP9z≤4w3yH0y2P→xzpvαts⊂:~2|FEλ⊂⊂⊂⊂~0{2P≥42P9XvrP6→w3z4⊂0w2λ:42P_t0y0Xz2y9H1wvx≠ytw3H:42vH0y2P≥42P9XvrW⊂λ v6εB⊂⊂⊂⊂λ7z42\⊂0z7[tqP7X52qz≤P⊂0y→P2xzXv⊂4sλ⊂0w2λ7w6<H4s⊂⊂≥42|P_y2P2\W⊂⊂⊂⊃7y⊂2≠z:2rβE⊂⊂⊂λ⊂80t\9P0w→⊂64y]9V⊂ %qual is dedineD recursively as the tso Car's being equAl
α and the two cdr's being equal. Thus equal could have been definedby2
α
March3, 1979∩∩$@@@@&dZb8∩∩∩∪ACOJ@HZf~∀_∩∩∩@A≠C
YSg`↓%KMKIK]GJ↓≠C]k¬X~∧~(~∀
∀$@@@@!IKMk8AKck¬X@Qp↓rR~∀$∩Q←dQKbA`ArR~(∩∩@@@QC]⊂@Q]k5EKe`↓pR@Q9k[EKI`AbRQUk[∃ckCX↓pArR$~∀∩∩@@@Q¬]H@Q9←h@Q¬i←ZA`RR~∀$∩∩@Q9←h@Q¬i←ZAdRR~∀$∩∩@Q∃ckCXQGCd↓pR@Q
CdAr$R~∀∩$∩@QKEkCX@!GIdA`R@AG⊃dArR$RRR~(~∧∩@@ASL↓iQKe∀AoCF↓C\ACUqSYS¬erAMU]GiS=\AM←HA]k[∃eSFA∃ckCY%irt~(~∀∩@@QIK→k\A]U[Kck¬X@Qp↓rR~∀$∩@AC9H@QKD@QisAK`Ap$@QisAK`Ar$R~∀∩$@@@@@QuKI←`@Q⊃SMMKIK]GJ↓pArR$RR~∀4∀@@@A)QSLA]k[∃ckCXAMk]
iS←\↓Sf@A9←hAi!JAgC5J@ACLAiQJA≠CG1Sg`A9k[Ke%F[KcUCYSid~∀@@@AMk9GiS←8X@zX↓EKGCUgJAi!JAYCQiKdA=]YrA
←[aCIKfA]=\[ES≤A]k[ Kef\4∀~∀@@@AβLABAG=]gKcUK]GJ↓←LAi!JACE=mJ@A⊃KMC]%iS←\0AShA
C\AE∀AgKK8AiQCP@AKcUCXA]∃KH~∀@@@A9←h@AQKe[S9CiJA]QK\@↓CaaY%KHAi<@AY←=aKHA1Sgh@↓giek
i`↔K*q↓α'r↓βπ∪&KS'?raβ↔DhQ↓↓↓αβπ3←∂KM↓βNkC3'/→β↔G,∧⊗br∧∧∧∞r
_NN8∧z4]2P⊂2→s4w4]4ww≠q⊂⊂2\zpv⊂
8πhi@
P@ASLA]← h)↓↓α↓βGWLεF*ε=z'ε.>E∩εO4∞FF∂@∧π'≡t v⊗V\:G4_<Y$<=0-Dλ~1D∞~→6$
≠{zd∞~→(∧∞x;9$∞z→;AQHλλ∧∧≤≤Z-n→9
}=C!! C"Mm⎇α"$∧λλ∀jXTH$<Yc!! Hλ∧∧λ≠[nD≤Y=∞≡Xπ9P≥⊂4s⊂~z9P0\3zvr[:⊂4iH74v⊗λ7z42\;tybH70v↔βE
julL SUBR 1 are
This is the sama as not. Both fqnctions are provided fOp the sake of
clarity. nudl qhould be useD to Check if something iq niL afD return a
logical Value. noT should be qsed to Invert the sanse kf a logical Value.
Even thou`∂PA1Sg`AUgKfA9SXAi<AeKaIKgK]PAY←O%GCX@ MCIg∀XDAs=jAgQ=kYI\≥hA[C-J~∀@@@Ak9IKegQC]IS9NAs←UdAae=OeCZ↓IKaK9HA←\↓aQSf8@A
←HAKqC5aYJX↓←]JA=IiK\↓oeSi∃f~∀~(∩QG←9H@PQ9←h@Q9kYXA`RR@\8\@R~(∩@@@@@P@8\\@R$~∀~∀4∀~∀~)!COJdZh∩$∩@@@@&dZD\∩∩∩@A≠CIGP@f0@brnd~∀ Predicates
rather than
(cond (x ... )
( ... ))
There is no loss od efficiency since these will compile into exactly the
same instructions.
See also the number predicates (page 2-65).
March 3, 1979 ∪2-1. Page 2-5
↓ Eaclisp RefeRence Manual α
~∀4∀∩∀~(~∀
∀4⊂α∧~(~∀
∀4⊂α∀~(~∧4Ph($(hP4λQ!PP"C"AQ@εEεBEεEβE
λ↓α
α~∀4⊂α∀~(~∀4Ph(∧(hRCπ∨*↓I5XHH%↓↓α↓MIhε∩`H⊃∀αα∧\≡&≡Bε5Bβ⊗w⊂hP`H⊃⊃∩¬&T∧/6≥NV∂&}!PPH!Q hPQ&"rα
Mε*∧↑l⊗g.≡Mw⊂λ!Q hV↑l⊗`H∀∧αα∧J:T∃∩∧∀ε␈∩ε ε∂⊗}1PPh$∧ααα¬W6∞D∂αJα↑f∞g\≡F/~∂¬Bαε≡4ε
εm}&jb∧↔&}]_2ε␈$∧ε␈&↑'>O<UBε∞l@απ⊗↑NW⊗w4∞FF(Q$ααα∧∞&/∨]NBph!Q"αα∧∧αF/l≥BπB∧∞αJε↑l⊗g.≡LW~π∧∧εNr∞Mε*ε=⎇g&/∞Dαπ∨\6N6≤\Bε↔∀∞FF(≤-⊗v&≥lrε≡⎇nF/GAQ"αα∧∧πε}≥nF/∩∞¬bα∧←⊗oεLW hPQ!∩αα∞<W'
∂∧β#~mvzα|,↔∩HQ!∩αα↑f∞b¬
FO∨D∧v≡}n4πBα|mvzJ⊃Q Jα∧∧αααπWbαCF4αrε,≡"Hh!Q hV≡∞εgH⊃∀ααα J5,∃$ε"ε␈$ε2ε∂,}0hPQ$ααα∧¬ε∂π
O∩ε2∂∃∩ε∂∞
FN/4∞FF*nVv∨M≥vrαdπ&z∞Mε*εM≡7"ε|dε∂⊗}]V.wN4πJr∧∧¬.vL↑7~εaQ"αα∧∧εO~≥bε7>\'∩ε}$ε6/∞∞"bπ>\6Bα≡2ε≡⎇lBε␈$⊗v"D∞vFN=∧ε/6≥NV∂&↑4αεON4ε∂⊗}]V.wN1PRα∧∧αεNd∧ε
εn]fwJ∧∞v∂JA≡FF*≡&?.\]g'~∧
⊗rπMRαεM≡7"α∂∀ε∂⊗T∧π/≡\Dαπ>≡Mε␈/D&.NlqPRα∧∧αε/l≥G.∂L\Brαλ←ε∞o
LW≠PQ!PPJ∧∧ααG<↑G
εd∧rZJ¬↔πεO∀ε2αuε∩β∩ε5∩JβWdβ0h!∀ααα¬∞6/'∀bα:U∀αF∂∞
GJεd∧rC
ε$β~J∀πSrαVAPPJ∧∧ααF≡∞εgJ∧|6}w4∧rBB4ε"β~∀εBJJπW`hP⊃∀ααα∧¬αBZε$β~J¬dβ"J
mw"αεTαrβE⊃PPh$∧ααα¬↔πεO∀αε0∨∀απα∀∞v␈⊗>4αεf≥<Rαε≡∞εgJ∧∞vO&∧∞G>z∧↔⊗?]\Vw'4∧ε/F<↑π"α∞Mε∂"∞Mε(h$∧ααα≡πεf≤<↔&N⎇dεO~Mvv*∧∞vO&∧∞FF*∞l↔⊗N≤-F*α-⊗v&≥lw~π>V≡Nm≤V"ε/∀απ&Tε⊗NlM⊗v8Q$ααα∧6}wL←π"π
⎇⊗w&↑$παpQ!PPh.≡V␈&Q⊃∩αα∧λe≥,*!PPh$∧ααα
Mε*π>V≡N≥Dε6␈-TαG∂]}F*π¬∀π⊗/NZ&w~∂∧π>OM
w/"∞N'NNltπ&z↑f∞g\≡F*ε≡Ebαπ≡]w&(Q$ααα∧
↔~α∞↑6."∧∞Fzε≥l6g.LTαε≡⎇n7&∞nN2αε≥dαε
mw⊗jd∧α∧6}$αε≡⎇nf.v≤]f≡*D∧π&FT∞&.∞AQ"αα∧∧ε7.l>FN}d
f␈⊗\≥FgJ=vw6↑.G~ε≥o∩¬~\←ππ⊗↑>6N}d∞π⊗.<\F."/∩π&Tαε∂
}7'⊗}
ε*ε}!PRα∧∧αε∞>↑F*ε≤<6.wD6F∂,≤7&/$¬α:J
→g&z∞Mε*π≡]w&*∞>ε.≡≤≥Bε6}-Rrαλmw∩ε←⊗oεLU@hPQ!PPh)\↔⊗≡∧ε2bβ↔⊗sHH⊃∀ααα∧α3∩k%a⊂HH~⊗>*ε%S8h `H⊃∀αα∧\≤6fO>∧¬⊗.l↑&.v<T∧n∞n\⊗`h!Q hPQ!⊂Jα∧∧αG≡↑N∩πB∧uπ≡}\TεfO>E∩Hh!Q"αα∧∧εO~=vw6↑.F."/∩π&Tπ⊗.≤LW∩πMw hPQ!⊂Jα∧∧αG≡↑N∩πB¬∞↔.␈LTαG≡⎇\Rεf≡>BJJ⊃Q hR∧∧ααπ⎇
⊗≡B∞⎇ε.r↑f∞g\≡F."<↔/≡↑4π&FT∞f∂⊗≤≤&f*∂∧π&z,Rπ≡↑Dπ&z∞Mε*α=vw∨L≥g"εM≡7 h$∧ααα∞l⊗g.T∧π≡F}⎇brαλmwαα
]w⊗*∧
⊗v6}-V∂&≥⎇bε}d∧εNw∞↑Bπ∨≥nF∂BD∧π≡.T∧π&FTF/&≥≥F. Q$ααα∧FO≡>↑7≡N⎇dεNr∞↔↔"εUc
pQ!PRα∧∧απ∂]}F*ε=}Vf"
↔6*,V.rLV6Nl\Bε↔↔!PPh!∀ααFL\g.r∞≡V␈&Tf/G∞$αGB∀¬ε≡∂$αJHQ!PPh,nVv∨M≥vpJ∧∧α∧5:X%⊂h!Q"αα∧∧ε7.l>FN}d∧εO~∧
FN↑T∧π∂.}LPN/<Wπ ≡Mε∂"∧
↔'~∧↔⊗?]\Vw"∧
↔~α∧∩αεn]f∨&≥⎇f∞`Q$ααα∧WGπ,↑7≡N⎇ebα¬Mtπ&FT
⊗w&↑.π⊗/L↑"bπ≡]w&*≥f"εn]f∨&≥⎇bε∂,TεN&]nFN≡≥EBε↔↑Dπ&FQQ"αα∧∧ε≡}↑
⊗f/$
f..N4π&z,Rε∞-LPO&tFO∨M≥f?.≡=αε⊗↑Nv..d∩π⊗≥lF}j∞
⊗.≡T∧ε}2L↔&
AQ"αα∧∧π>F≤=απ≡
}Vf",Rεf\nBε∞M⎇f*b≥f"ε∀λg.v>M⊗}rD∞vFN=∧π≡F}]F"ε,Tαε≡⎇↑εNf\@εNwMqPRα∧∧αεn≤=εNvT6}&Udα∧/≥WεfU!PPh!∃εn∂<↔∩αnVv∨M≥vrα
L⊗n⊗L∀αGα∞∃⊂hP⊃⊃∩αα∧∧αF≡⎇lBαB↑∩πα∧u"Jπ∃⊃PPH⊃⊃∩αα¬∞BαFM≡7"π∧∧sjπ∃∃∩αJ∃⊃PPH≤m↔↔∨E]FO∨E]v2oM
⊗v?1Q HJ9voπ↑LRn∞mzFF/%]FO∨E∀αHh!Q"αα∧∧ε≡∞MN2εn≡6∂∩∧∞vO&∧∞FG⊗\Tαε∂,}Vn.β]≤eD≥~→$∧→Z4N>λ≠yD∧≥z~,=λ~<d∧≥~→$];XnM;{C!$λλλ∧→9R-l9λλ/(λ≥
(≠⊂-\Y_+,←≤≤Y.>z;{Edλλ∃
"88nN8;λ∞l;≥9$∧≤_<n<9λλ∞Mh≠8.x8C!$λλλ∧→<→-l≤h≠md≥z→.M→<H∞M→(→M}[(~≡h_Y,]H_{m↑~;→,EHλ∩,d~=λ
≡hλ~-n→<\∞,=→9¬D≥~→!QHλλ∧∧≠_;,,_+9/∞≤Y<n=;{H∞}Z=≥]B88M}Y(≥m≥≠λλ,(≤_.>y9βA→9Hλ
≡λ~<d∧_{s.
;→9¬D_;C!$λλλ∧==≠m\=~8l≥≠≡+,|;Y<L≡→9λ∧=≠{-≤hλ≤o≥8[{∧∧≥z=
∧≥~→!≤{{<
≥→9λ∧{y→!≤[|H∞M→#"D∧λλλ
L;8Y∃9>≤∞,<|z-⎇H_<d
=≤h∞>8\H∞∞[|→..≡(≥m≥≠λ_LT≤_<n<9H∧
~→(∞↑⎇8;∧∞~~;Lt≥≠c!$λλλ∧≠h≥m≡~λ→N]X⎇~-⎇X;λ≡Y⎇;,]]≤h
≡h≥≠d
;][m<(≥~](≥Z,∀_<≤
O(≠|D];Xl≥≠λ∞⎇~8z↓QHλλ∧∧_8xl↑≥λ_M}~λ≥
(_{m↑~;→,D_;Y∧∞~→(
≥]→<N∞Y=→,D→];L>~;{L≥λ→[n-<kC!!"Hλ∧∧λ→]-l⎇~;md≠8:l↑h≠[d=≥→-↑≥λ≥
t≤{{∞l(≥~TλY]-l<Yh∞∞[x[]+HH∧¬Y];L>~;{D∞z≠⎇-Lβ"H∧∧λλ_LT≥<y,D→[|D∞~~<d∞≥<\
}y+C!!"C"AQT_9lTK.↓⊃"(λ∧∧λ∧lEVKB"!∀λλ∪,≡Xzλε5λ.&w#"@↓A"""$
~→(λ↑X;≥,≡≠|C!!"C"E,];XnM;{B$∧λλ⊃J:0TC!!"Hλ∧∧λ∃~T≥X;∞\(≠yD¬
Y]-l⎇~;md→J(
≡h_(∧,];X.,hH≠ld≥~→$];XnM;{HeHλ⊂$∧→];L≡Yh_l≥C"H∧∧λλ_LT≥<y,D≠~:lT_(→N]X⎇~-⎇KHλ ≡λ~_.4≥~→$9→~.M;{X-D≤≤[n<]≡$∞~_=∧∧~=λ={]_-≥\c"D∧λλλ∀_Z;LM;Yh={]→/∞α<≠m≥]→<D∞{h≥
=λ≥
(λ≥L≥≥9<d
yH≥L≡Z88ML<h_.,(λ_M};Y∞M→#"D∧λλλ∞<;9(N<Z;Lt≥~→$<≤∪
≤x=~-⎇H≠yD∞~→(∧];X.,h_<d=λ≥
(≥~-\(~=∧∧≥x<d|Y8.L9β!$λλλ∧∞≤[⎇M≤→9λ∧∞~_=∧∞~→(∧Z;Y
≥Yh→-nZ<[mm9;]∧∧~;H∞⎇~8z↓≡~→(n;X<Ltλ≥x.4_|Y,≡→9β!$λλλ∧∞⎇~;
D→>~.>≤hλ
⎇H≥~Tλ≤⎇≤zkH ;Xy$∧~9Hm{hλ
≡h_(∧];XnM;{H∞M_=∧8xq.∞≤h_!QHλλ∧∧→];L>~;{L≥λ_<L};93NEλ≤⎇,=λ_<aQA"B$∧
→→,n;H→M⎇h
→E⊃"B(∧∧λλλ¬<≤→-lλ≠{LU=X;∞\(
→D∞~→+-}~→<E↑X;≥,U(
*!QC"B$∧≠|K∧Y=≥↑C"C!!(λ
L9];D[{h¬J#"A∀λλλ∧∧
_<∞;Y
⎇Y+=L≥≥9(¬];Xl≥≠λ→D∞~→+-}~→<E↑X;≥,U(
*!QC"B$∧≥~→-a"C"A∀λ
→M⎇h
LN;Xu
≥{H_L≡J*#!!"B(∧∞{|Zn5λ_].A"C"A∀λ
→M⎇h
≤∞-yh
∂∧≡(⊗E⊃"B"$∧
→≠d∞{{9.M~;Ye⊃"B"$∧
≤Y.N<[H¬¬Y];L>~;{DX<J¬∀λ*#!!"Hλ∧∧λ→≠l↑h≠[nDλ~9DX<H∧
;]→-l≤h≥
tλ≤Y,l<Y;L<(≥~Tλ≤≤M|h≥X.-88[↑hλ≡¬D≡+λ∧9Q⊂≡↔εE⊂λ⊂⊂⊂∃→8s1j~ww⊂4\β intended to Help solve the "funare problem hoWever it only~∀@@@A]←eWf↓S\Agses. Funargs generated by *function are intended for
use as functional arguments and cannot be returned as values of functional
applications. Thus, the user should be careful in his use of *function to
make sure that his use does not exceed the limitations of the Maclisp
funarg mechanism.
It is possible to assign a value to a variable when a previous binding of
that variable has been made current by a funarg. The assignment will be
executed in the proper context. (This has not always been the case in
Maclisp; it is a fairly new feature.)
A funarg has the form
(funarg function . context-ptr)
March 3, 1979 ∪2-2. Page 2-9
Maclisp Reference Manual
comment FSUBR
comment ignores its arguments and returns the atomic symbol comment.
Example:
(defun foo (x)
(cond ((null x) 0)
(t (comment x has something in it)
(1+ (foo (cdr x))))))
Usually it is preferable to comment code using the semicolon-macro feature
of the standard input syntax. This allows the user to add comments to his
code which are ignored by the lisp reader.
Example:
(defun foo (x)
(cond ((null x) 0)
(t (1+ (foo (cdr x)))) ;x has something in it
))
A problem with such comments is that they are discarded when the S-
expression is read into lisp. If it is edited within lisp and printed
back into a file, the comments will be lost. However, most users edit the
original file and read the changes into lisp, since this allows them to
use the editor of their choice. Thus this is not a real problem.
prog2 LSUBR 2 or more args
The expressions in a prog2 form are evaluated from left to right, as in
any lsubr-form. The result is the second argument. prog2 is most
commonly used to evaluate an expression with side effects, then return a
value which needs to be computed before the side effects happen.
Examples:
(prog2 (do-this) (do-that)) ;just get 2 things evaluated
(setq x (prog2 nil y ;parallel Assignment
(setq y x))) ;which exchanges x and y
(defun prog2 nargs (arg 2)) ;a lexpr definition for prog2
Page 2-10 ∪2-2. March 3, 1979
The Evaluator
progn LSUBR 1 or more args
The expressions in a progn form are evaluated from left to right, as
usual, and the result is the value of the last one. In other words, progn
is an lsubr which does nothing but return its last argument. Although
lambda-expressions, prog-forms, do-forms, cond-forms, and iog-forms all
use progn implicitly, that is, they allow multiple forms in their bodies,
there are occasions when one needs to evaluate a number of forms for side-
effects and make them appear to be a single form. progn serves this
purpose. Example:
(progn (setq a (cdrfrob)) (eQ (car a) (cadr a)))
might be used as the antecedent of a cond clause.
progn could have been defined by:
(defun progn nargs
(and (> nargs 0)
(arg nargs)))
progv FSUBR
progv is a special form to provide the user with extra control over
lambda-binding. It binds a list of variables tk a list of values, and
then evaluates some forms. The lists of variables and values are computed
quantities; this is what makes progv different from lambda, prog, and do.
(progv var-list value-list form1 form2 ... )
first evaluates var-list and value-list. Then the variables are bound to
the valuas. In compiled code the varaables must be special, since the
compiLer has no way of knowingwhat qymbols mieht appear in the var-list.
I`Ai=↑AMK\AmCYUKfACIJAgkAaYSK⊂XAiQ∀AeK[¬S]S]≤AmCe%CEYKLACeJ↓E←k]⊂∪i↑A9SX\~(@@@@↓∪@→β&{=β7∞seβ[∞cW/4↔⊗*∞>WπεM≤V"b∞Mε*ε←6/∨4∞f∞g\↑2ε∂,TεN>m}&."aQ h∩∧∧αα∧≤nF/∩∧
FF*∧∞f∂⊗α88ML<hλ
=Y(∧Y90↔αq7z@Nd to the values$ the fcrms are
evaluated, and fInadly the rariable bandings are undoNe. The ResulT
retqrfe@⊂ASfAQQJAm¬YcJA=H βSF)↓β3∂≠Qβ≠⎇∪52∧ f␈&T
FF∂Dλ
(λXM|≡ @⊂≠qp@ prggv
ic pπC@7L¬F∂∩∞Mrπε≡Bε↑d
πε↑⎇`∧
Yp~≤40`∀↓←DAaI←F\~(@@@@↓qC[AYJd~(~(∀TkπK∂@∧β~Bε⊂∞&W ∧DDλ⊂⊂⊂⊂∧Y⊗P∩. ↓@@@@@↓!COJdZbb4⊂_∩∩∩@A≠C
YSg`↓%KMKIK]GJ↓≠C]k¬X~∀~(~∀~∀$QgKiDAB@O→←↑ADOECd$~∀~∀$Qae←≥l@QY%ghAB↓D@OD$@QYSMhADRQYSgPABAD↓M←↑A CdRR4∀∩@@@z|@!M←↑A9SXAE¬dA]S0R~∀~(@@@@↓ ceS9NAiQ∀AKmC1kCiS=\A←L↓iQJA ←IrA=LAiQ%fAae=OlXA→←↑ASLAE←k9HAi↑AECd0AECd4∀@@@ASfA ←k]H↓i↑A]%XXAD↓SfAE=k]HAQ↑A]S0XAC]⊂ABAe∃[CS]LAE←k9HAi↑↓M←↑\4∀~∀~)CeN∩$@@@AM+¬$@DACeN4∀~∀@@@@Q¬eNA]%XRX@↓oQK\↓KmCYUCiKH↓IkeS9N∪iQ∀ACaa1SGCi%←\A←_@ABA1Kqad0@AOSYKfAi!J~∀@@@A]U[EKd↓←LACIOk[K9ifAgUaaYS∃HAi↑↓iQCh↓YKqaH\@A)!SfASLAaeS5CeSYdABAI∃EkOO%]N~∀@@@A¬SHXAMS]GJ↓YKqaIfACYM↑AeK
KSmJAiQK%dA]k5EKdA=LACe≥k[K]QfACf↓iQJ@↓mCYk∀A←L~(@@@@↓iQKSHAYC[ IB[m¬eSCE1J\~∀4∀@@@@QCe≤ARRX↓oQK\↓KmCYUCiKH↓IkeS9NAiQ∀ACaa1SGCi%←\A←_ABAY∃qadX↓OSmKLAiQJ↓mCYk∀~∀@@@A←L↓iQJA$OiPA¬eOk[∃]hAi<AiQJ↓YKqaH\@AR↓[kgh↓EJAB↓MSq]UZAS\↓iQSf↓GCgJ8A∪hA%f~∀@@@AC8AKee=d@AS_AR@A%fAYKMf@Ai!C\@b↓←d@A≥eKCi∃dAiQ¬\@Ai!JA]k5EKd@↓←LACIOk[K9if~∀@@@AMkaaY%KHAi<AiQJ↓YKqaH\~∀~(@@@@↓qC[AYJt~(~∀∩Q⊃KMk\↓M←↑A9CeOf$@@@@mIKMS9JABA1Kqad↓M←↑\4∀∩@@@Qae%]h@Q¬eN@d$R∩@@@wae%]hAi!JAgK
←]HA¬eOk[∃]h\~(∩@@@PV@Q¬eN@b$∩∩@@@weKQke\AQQJAgUZA←Larg (- nargs 1)))) ;and next to last arguments.
setarg SUBR 2 args
setarg is used only during the application of a lexpr. (setarg i x) sets
the lexpr's i'th argument to x. i must be greater than zero and not
greater than the number of arguments passed to the lexpr. After (setarg i
x) has been done, (arg i) will return x.
Page 2-12 ∪2-2. March 3, 1979
The Evaluator
listify SUBR 1 arg
(listify n) efficiently manufactures a list of n of the arguments of a
lexpr. With a positive argument n, it returns a list of the first n
arguments of the lexpr. With a negative argument n, it returns a list of
the last (abs n) arguments of the lexpr. Basically, it works as if
defined as follows:
(defun listify (n)
(cond ((minusp n)
(listify1 (arg nil) (+ (arg nil) n 1)))
(t
(listify1 n 1)) ))
(defun listify1 (n m) ; auxiliary function.
(do ((i n (1- i))
(result nil (cons (arg i) result)))
((< i m) result) ))
funcall LSUBR 1 or more args
(funcall f a1 a2 ... an) calls the function f with the arguments a1, a2,
..., an. It is similar to apply except that the separate arguments are
given to funcall, rather than a list of arguments. If f is a fexpr or an
fsubr there must be exactly one argument. f may not be a macro. Example:
(setq cons 'plus)
(cons 1 2) => (1 . 2)
(funcall cons 1 2) => 3
subrcall FSUBR
subrcall is used to invoke a subr-pointer directly, rather than by
referring to an atomic symbol of which the subr-pointer is the subr
properti. The form is:
(subrcall type p a1 a2 ... an)
¬
All argumeNts except the first are evaluated. type is the type od result
expected: fixnum, flonum or nil (any type). p is the subr pointer to be
March 3, 1979 ∪2-∩, Page 2-13
Maclisp RefeRence Manual
∀~(~∧@@@AGC1YKH\@ABbAiQe=kGPA¬\@ACIJ@Ai!JAC¬≥k[K]Qb@Ai<@AEJ↓aCgg∃H@Ai<@AiQ∀AgkEHX~∧@@@AgUEeGC1XAG←αkC'3/→β';&yβ↔≠6K∂'↔w!β7π≡C';∃ε≠?∪∃ph 4λhS3OW↔∪∂π3`A↓↓↓∧2NV
⊂h(4)α↓↓↓βg≠WK≡3!βM→β'∪.sS'∂∞aβS=π≠WK≡3!β,πε≡/∞@πεF_@λ∞M→(∀n\\K<
⎇9]→.$_x;
L9λ∩≡c"H∧∧λλ∃
tλ_Y$∧_;H
∞⎇8\D∧~;\nL89α-|β⊂ @λ9zq9⊂⊂⊂*~4yP4\P⊂12XpzyrBvpw<H⊂&4y\9P:yYFA⊂⊂λ⊂⊂24Y32y2[:⊂4g≥2y70[⊂1pv≠4s3@ qaqe@∃]GKf↓MP∨IεcGW↔→βS#∞qβ≠?⊂β@∨...2ph!Q hV≡.&∂N<≥F`J∧∧α∧5:X%⊂h!Q"αα∧∧ε∂↔,∨⊗≡∞MA⊗O~∞=⊗nNL≡"απMq↔∂..,6∞fDλ⊗v"∧ G∂..,6∞fDWF≡↑∞@O&≡Bαε≥dε∂↔,∨∩hh$∧ααα∞
vNwLZ"αε≡4απ/<X@NNn>F.∞D∧ε}∩∧⊂O∨\."oε⎇≥g&/%a∃&FT∧ε6O.:Bαε≡,w.n]nBε↑aQ"αα∧∧ε∂↔,∨⊗≡∞MDεo/>Dε≡␈.,W>≠{Y∧∞≠h⊂~~2P:<\2P:4_z⊂:4→P0q9_|P;p\P3t{→w⊂;t→w⊂4`4 wa`&4∀@@@AGeK¬iKH\Aβ\@↓CeeCeGCYX↓Kqae∃ggS←8A[CrAEJAUgKHA¬b@Ai!JAMSIgh@A¬eOk[∃]hAi<~∀@@@Agi=eJ\~(~∀
∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀
∀4∀~∀~(~∃!C≥J@dZDh∩∩∩@@@@LdZd\$∩∩@@↓≠CeG @fX@Drnr~(_∩∩∩A≠C]%akYCQS]NA1SghAMiekGQkeJ~(~∀~∀4∀~∀f8@A≠C9SakY¬iS]N↓→Sgh↓'iek
ikeJ4∀~∀~(f\b@↓π←]g∃f~∀~(~∃GCH∩∩@@A'+¬H@bACIN~∀~(@@@@↓%KikI]fAi!JAMSIghAG=[a←]∃]hA←_ABAG=]f\~(~∀@@@Aq¬[aYJh@@QG¬d@NQ∧ADRRz|AB4∀~∀~)GId∩$@@@AM+¬$@DACeN4∀~∀@@@A%∃ike]LAiQJ↓gKG←9HAG←5a←]K9hA←L↓BAG←9f\~∀4∀@@@AqC5aYJt@QGIH@NQB↓DAFR$@z|@!DAFR4∀~∀~)GCd∩$@@@AM/∪)π ~∀~∃
Id∩∩@@A']∪)π⊂4∀~∀@@@A∨→MSGS¬YYrA
CdAC9HAGIHACeJ↓←]Yr↓CaaY%GCEY∀Ai↑A1Sgif8@A⊃←]KmKd0ACfA∧A[CiQKd~∀@@@A=LAG←9mK]S∃]GJAQQJAG¬d@AC9HAGIHA←LA9SX@A¬eJA]%X\@AQQSfA¬YY←oL@Aae=OeC[LAi↑~(@@@@↓GCd@↓C]HA
Id@A=MLAi!J@AK9IfA←_@AYSMifAo%iQ←kP@AQCYS]NAQ↑@AG!KGVXAoQS
PASf4∀@@@Ag←[∃iS[KLAQKYAMkX\A
keQQKe[=eJX@↓g←[J↓←YHAAe←Oe¬[f@A¬aaYr↓GCdA¬]H@A
IdAi<~∀@@@A←E)KGif@A←i!Kd@AQQC\@AYSgQf@AS8∩A←e⊃Kd∪i<@@AQ¬GV@A]SiP@AiQJAS]i∃e]CX4∀@@@AeKaIKgK]QCiS←8\@A)<Aae←YSIJA
←]ie=XA←m∃dAiQ%fXAi!JAmC1kJA←_AGCd↓GC\A JAgKP~∀@@@Ai↑↓G←]iI←XAo!SGPA⊃CiBAQsaKf↓CeJAMkEUK
hAi↑↓iQJA
Cd@A=aKeCQS←\\A'S[%YCeYdX~∀@@@Ai!J@Am¬YkJA=L@AG⊃dAG←9ie←YL@AiQ∀AGIdA←aKICiS←8\@A∪1YKOC0∪←aKICiS←9fAoS1X~∀@@@AG¬kgJ@↓Kee←If\@A→←d@AIKCg←9fA←LAKMM%GSK]
rXAi!Sf∪KIe←dA
QKGW%]N∪SLA←]Yd~∀@@@AK]¬EYKH↓S\@@ UegKPAhRA5←IJ@QgKJ↓aCOJ@fZddRAC]⊂ASf@↓[←gi1rAikI]KH@↓←MLA%\~∀@@@AG=[aSY∃HAae=OeC[L\@A)!JAmC1kKfAQ↑AoQ%GPAi!JAgo%iGQKLA[Cr↓EJAg∃hACe∀t~∀~(~∀~∀4∀~∀~(~∃≠CIGP@f0@brnd∩∩∩@@@@&HZf\∩$∩@@@@@A!¬OJ@d4bj~∀_∩α∩@AC
YSg`↓%KMKβ∪↔;∂*α7π≠.0$λhP4λQ!αα¬l≥G∞(λλ∧∧λ∪t↑X=~-⎇H_<∞
~8p,-→(∃
q"C"A∀λ≠∩.z∧P⊂λ⊂⊂6$\z9WεB∧P⊂'~v∧P⊂λ⊂⊂6$\z9P [2⊂74[↔αE∧λ⊂9|`-bkl l@%`∂SMbβ;'EDε∞vD
7Nn-yG4¬
λ t Anything.
∀@@@A)Q∀AIKLαW3Q¬3π3W*β? β&C∃βO>KS∂"-→β'Mεs'1aQ h⊂Q(λE@↔↔9∧BP⊂⊂⊂∀ja)⊂P0`∩g
~∀@@@A¬YP@Aβ##∃↓∧≠?7C|ε6O&≥yg4λ≠qD∞αx⊂⊂≥0∂ f@=kd@A
CdO@~βπ;⊃αβ∂∪I?_'πK*↓β∪↔0
⊗v.Dλ↔λh ∧αααjVv∨M→vw~e`∂S\αβ←πS@∧ε~ε≥lBε.βQ⊂≥tz4 r,¬]H~∀@@@@αK9β(εG>∞]`λ
≡h⊂ ⊂≤β`@FεP
ly(λ
|β⊂ !≥`
βπv!β⊃≡α4ε≡␈,∧Y.x7w2~w3@ 4o↓the comPosadion¬
⊂erfO↓IP↔.@λO∀≥~→$Y0↔1≥4p∂n8~∧4R↓↓↓↓∧37Iα∧P∞≥8∪2K∧¬∀∩ ↓↓↓αC∂&L≤G$≤∧∀P∞P⊂λ@Gα#@∩αα⊂`∩≤α ⊃↓_↔$λ∧!@dp∧A`!JA%$Q!P@$λλλ∧
y{1$∧≠yH∞
→(λ
≥|⎇⊂_wvfw[4∧p∩↓`↔O⊗∧@λ
⎇Y<h∧8 2]λ1pr9⊂⊂;t~qp⊂'ets the @MKGO]⊂∩∧@@@AK_ε+ .8π: o`A↓λ∧ε@M<⎇≥↓ caddp∧XAo!SG@Aα;↔SM∧εFF*∞MεO⊗@→-↓2p
E↓9`A←L↓B@A_αK@∨#4λλl≤α229¬∀↓α↓↓↓β>C'∂↓∧v/'4λ
(⊃@7\y24 eleMenp o_ABA↓`¬↔>∞h⊂⊃Xpqε⊂≤∧`≡Aπα@∩πL¬z,≤αWεEα@
The ca@dα;';≤∧λλ-lλ_p∩≤α ∂S]≤A@∨C(∞&∂&≥xNP7s⊂≤42y`% feNcti`∨]LAQC0∧Rαε↑.&␈∩λλ`4→qqd`.dε~(α↓↓↓β(¬f&.$
(⊂`7[8∧ro@0A@?→∧εFF*0λ.∧_;Y∧y⊂→ pπoSI
QKfAα+cC3∞K;↔⊂∧∧⊗⊗@⎇Y+∧
]<p~λ0qP 4he~∀@@@A
CdAβ9HAGIHAMk≥
iSO]LAaQJαk@≡∞β⊃@∩\β do.
~∀4⊂∂?u_$¬↓α↓αN⊗⊃⊃↓Iα∂∪∨_Q!P@$λλλ∧
~~0→H4yP H894fZz4s"H32w1]4p∂n↓i@≥↓∧≠?;O'∪G∂Q∧∧∩εv↑pλM⎇→→,D≤_:.⊂;t7\p¬ @
CdA∪β_4)↓α↓↓βSF)β≠π↔≠Qβεα,w.n]nBπεtλm⎇\kλ≥Yλ∃m
|y(<≤H⊂∀≤β the sec↓=]HACI@∂W7(
g"α∞Mrε≡⎇j2`@ ¬⊂λ⊂⊂*4≤yP:4→P3'f~0πwiNdεASI∃]aSi%Kf@AαC?3⊂αC↔c∂(επ"π⎇VrεnYV⊗/(∧h≡Y(λ
≥][`⊗≥2r≥@ as
¬Y`∨εβ⊂d
β:fa→y1P \2P77\⊂;r`,hλ[EK!CmKHαβ←'S@∧π,<|⊃>λ≥≠d<*.AQ@εE∧↓ (eq ⊃εα@∩αλ0≠mnh≡∂∃*(⊂≤
P≡P≡p~(J↓↓↓λP≤$∧_q≤D¬_p↔`.pεA@!¬I%%βJI↓e@dλ
↓⊂@εEεBα
∧~(~*C∞;∃↓λhεβ! "(∧∧λ∧lEVi@λDB@P⊂⊂∪pq1`( 3 _↓β eMdhP $∧J↓α7πvCC@.β_=
≥Yh∪
≡⎇λ∀nN]0p~≤¬re
α~∀4⊂λ&↔F7C3-→`⊂↓ ¬∧Pλ⊂⊂∀1[w9P∪XP∪q( 0
`9αC¬↓dλ"Hh!∀ααα¬6}w4∧v
αα⊂`↔[9P∪qλ∀1`/@9`
↓∨~β;'A∃αJβUdαF
λ λ5 εE∧λ⊂⊂⊂∀_ww9P pP∪D_⊂1P"λ2P3∀JP≡W⊂
0P! c dAα)β→$hP4Pβ"@↔_ww9DBP⊂⊂⊂∀ha)⊂P0`∩g
~∀@@@@!]G←]LA`@$βi↓#∞|¬g
εαλ∪M≥λ(∂$¬≠~4nD≡
#! ¬εE≡1ww9BDP⊂⊂λ)ba)λ→⊂ y_βs
λ xcoNpε@@!⊗+c∂#∞s∨¬β≤{;M Jβ'MβdK'¬β≤¬vw~←ε≡/∞Dπ&F≡@λ∞M→(≠n→<H
|H_<L};93NNh~4aQHλλ∧∧≤Y=L↑\y1¬A"C"D∧λλλλ←_;<
L.C"A⊃ (λ∧¬≤_p↔[9P∪pH∪q∀P∂←⊂∀1λ↔⊂0@)
¬
α
α
March 3, 1179 ∪2-3.1 Page 2-17
Maclisp Reference Manual
3.2 Lists
last SUBR 1 arg
α last returfs the last cons of the list whiCh is its argument.
↓Example8
(setq x '(a b @AHRR4∀∩αQ1CghA`R@z|QHR~(∩∩QeAYCGHQP∪π≥!βa∧α9#∃β2I$4(HKa↓ur↓#¬α⊂β
β⊂∧∧Rε2⊃Q h∩∧∧ααεL≡7"ε=p
-Lλ~_.l(_Y,]H→→,@4s2`$ by:
λ
(JC∪↔≠,qβ#εα0
∧¬≤∧∀FB∧P⊂⊂λ∀1g`.d (null `RA`!Hh $∀∧αB↓≠];
∧λ⊂`∩≤⊂8∀TH<⊂
((` C_εBαF8N"πBα"*$¬*#"AP¬⊂⊂⊂λ⊂ w≤βome impl∃[@↔nL↔&Nβ{\eD≥~→$
Y;⊗αqt2`#hεACE=mJA≠¬rAEJ↓aKa_α∂π⊃∧'H∞≥`ε∂&⎇QPBα∧∧αε≡PλMP which wi`→X↓GCiGαAβ∪>'#↔↓↓∧¬FO∨L5bα∧=p T≥z~,=λλ⊃↑→0↔2≤β onAaQRβ→β≠π≥ (∩∧∧ααπ=
w.fD≠M}λ_Y$∞|Z0~≤∧ef thoeGh, becausD a`→X↓S[aYα+7.β]_.M9{\d<Y(∧∞⎇8ZL\⎇λ⊂~≠FA⊂⊂λ⊂⊂1d_w3rP≠w⊂:4~yP8'Zw:↔εB¬α
le`≥OQP∩$α↓↓α∞αX%∩β∀λλ.c"C!⊂⊂⊂⊂λ42g3]4⊂92]8¬rns the heNgth O`∧ASiLACeOU[@↔nABαπ⎇
ε≡B
↑W∂"∧λ&*ε⊂λλ
M<⎇βD∧∃~→!PHλλ∧∧≠→3L}~λ⊂↔Yα a1SghAαK@~πMRεV]\&/∩ x D∞≠|-L=Y0⊗λ1ww9YyP4@. it.
λ ∀∪∃qC@7εc↔MhhP$%#d∧Fv?MεvNE∀βkr∧↓PPH∃
F.v}Mαα:λ⊂ε∩ε4BJJ↓Sbβ Q!JFL]f?&∧∧rF
¬"ε~⊂λBJJ↓P∂Dεc"C!∧λλλ∧
→3YnMλ_{n]→λ⊂∀_{2P!→rs⊂2→s4w2Y⊂1<]βEαEεBEεEβEεEεB(0srH→⊗X\αD@P⊂λ⊂ YεLW→∧DBP⊂⊂&Xy1t⊂V⊂_\M\BEβ∧DDPλ&pw4\:v0z~w3P&~yz⊂)]9:qj≥y2FEβEαEεB∧T22Y8w⊂6→w3z4λ∀<∀FB∧P⊂⊂λ∀1ww→⊂∀∀7≥v6⊂<
P_∀FB∧DP⊂
∀_UP
62w3]4⊂∀1Y9⊂<∀JTTP∀JFE∧w\⊂1<]βEαE∧J22s*[⊂62w→z4⊂∀≡∀BE∧H⊂⊂⊂∀→7P∀∀≠⊂_⊂∀UP7∀JFE∧DH∀<P<λ∀1r9λ<TTTCEDT
7:v6λ<TP7
P⊂TFBεE⊂⊂λ⊂⊂*4→P;py≠4w3@_q7zzλ27z:→r⊂64\z9P3Z{2w⊂≥w22yλ60yzλ0x86~ryP0[9wP:≠P62w→z4↔εBεEεE≠4yz∧BP⊂⊂⊂∪)ja)λ_⊂7yλ6wy2H0y3yCEαE⊂λ⊂⊂⊂6~yz⊂1[w9z9≥qz9P_w2⊂9→z:y7≤P0P&~yz⊂'Y⊂4z9H0y3z[rs:9KεEεEλ⊂⊂⊂⊂⊃|0vx≠2]εEαP⊂⊂⊂λ∀64y]⊂→P~λ∪pP∀_py⊂∪J1⊂↔⊂_TTP∀
P≠⊂⊗L∀TP≡O⊂∀→P
⊂0P!λ~∀FEβE⊂⊂⊂λ⊂64y]⊂1wz[2⊂40]2P12Yw⊂22Y4w2rλ1<]εBεE∧T→2s:wλ64yzλ70y3\FE∧Pλ⊂⊂∀2≠P∀∀7λ70y3\P∀_VH7∀TFB∧DP∀≤P74vλ∀1ww≤P∀0y→P7∀P≤TTTFB∧DT∀≡2y7xλ7∀P9JP⊂TFB⊂⊂⊂⊂λ∀*44\P22x→w29P≠w⊂80\0r62[⊂0yyZsw6r[:⊂:7H:42P_ww:9≠v⊂;0\4pq6→yP7sλ27W∀CEεEεB0x82[2∧DPλ⊂⊂&)Ua)⊂_λ7y⊂6[y2P0\3yFEβE⊂⊂⊂λ⊂*42H0y3z[rs:9H⊂:7P_x82w→⊂0y2H⊂64y]9W⊂⊂∃42Dy→yzv:λ4yP0H⊂64y]⊂;t4Xt⊂⊂4\P:42CE⊂⊂⊂λ⊂1ww_pz2w_z4wwλ⊂7s∧]42P⊂_y3zvYw:9Wλ⊂*42H⊂0y3]vrw:≤P⊂0y→P⊂77]⊂⊂1t_w3rrλ∀1s↔βE⊂⊂⊂λ⊂71w[1TW⊂λ#7y⊂→|0vx≠2VεEβE∧P⊂λ⊂∀0x≤2w2⊂ T0P!λ1TP∪J2⊂2P→∀P74[⊂∪T3JTP≡←λ∀0P!λ1P2⊂→P3⊂3JFEεEλ⊂⊂⊂⊂∃7P6pZrP0@_wx<P≠s⊂:4→P:7xλ62{2[⊂⊂7sλ0P6$\z⊗⊂*~0z⊂4\V⊂:7H1wx<H:42Pλ64yzλ1:zεB⊂⊂⊂⊂λ73z~z9P2[2vrg≥9V⊂*\rP∀0\82w2λ<⊂74[∀WεEβEαEεBεE&p\1t⊂→K⊂_\[ND@DPλ⊂⊂ YYW→∧BDP⊂⊂λ⊂⊂⊂(_srP→X\FEβ∧DDPλ⊂"pq[4yx⊂∀2s2i→w1rP∪pw:p[∧AεEβ@
A versi@=\A←LACAa∃]HAo!SGP@↓←]Y∩↓CGGJββSL'';=βεα,w.n]nG4λ_sn]→λ
=Y(,9;C!$λλλ∧→9@∀[2r⊂!≡]
λ (dedpLA¬aaK]⊂d@Ap↓rR
∀ @@@@!G←]HP@#;.c!βAJβe$∀PH%↓↓@C∂?;~↓#∂εα λ∂∧∧P∀0\82w2⊂⊂λc⊃`A`R↓rRR@$RR
∀4⊂@@@A)QJ↓@∂.hPL≥~>P.M9{@⊂≤4π any number ob Ar`πk@7(¬g'~9w.fD
9H_LT≠89Q=<r-lh_#!$λλλ∧
→>≤∞'@εEεB∧T22Y8¬f append argcount
λ (do ( i (1) ar`πG←k9hR@PDZARR$~∀$J↓#@6≥DαF∂,pε∂⊗|9w∞wE∀αF∂∞λ -lH
≡Yh∩%∀≥X;¬∃*#"A⊃*
≡L↑Yp_⊂~TP; [∀P∀TCE
λrevEp¬gJ∩ @@@AM+¬$@DACEN4⊂∩)α↓↓↓α>K[↔9ε β3'≥!↓βπ~βπK∨(¬V.wEDπε/lXN≤αP!@2eates a ↓9KnA→αK@∨"∞⎇ε␈≡T∧ε.fY\Vwπ4λ↔ε(Q$ααα∧
(→ 6→vrw:≤β o@_ASi@~βπK≡αP,]]λλ∞8¬`%8AS@9∧ε&/6↑.6*α p≤LL<K@⊂λ92{ %p¬gJ@↓I@∨↔~β;/PhQ↓↓↓αβ'?∪L∧gJε_¬≤d8Y⎇-\αp∞t0A`↔h4Zβ`
A↓w∪↔K↔↔≠∃↓β>C'∂↓¬↔4→P⊂y]2q chA =Kf@@αk?&≤`∞$
=⊂ FBα a`%OU[@↔n@A_>⊂;.ε2@:
λ∧4!⊃$∧λ
≤L↑Y<\lT b_$H
_dλ∧@ ↓⊂RR@↓hπbα↓→(
∀→∀P_⊂0@)
λ∧4!⊂≤L↑Y<\lT_p↔@uld Have Been @I∃H'h 2λ1<]εBα~(JC∪↔≠(¬bπ⊗↑`→.9rP∀≡⊂ ~∀ ↓↓↓αC∪:¬
∧≤∧⊂∀_p∧r@0RR$∧∧ααα∧∧β@4≤p`⊂[⊂27@6l a@%≥c[K≥PX∀!⊃$∧≤@↔~v∧D@λ⊂⊂⊂⊂λ≥P85pp S]≤AKCFαAβ↔LP≠,]]β"A⊂∧P⊂⊂λ⊂λc@↑εs@~αα⊂⊃@ap∧AX↓Hβ@∩J⊂
πP4w*~β liM`XAjεsC'AQ H↓*
∪N≥≠6
P9∧T
@ :∧A@≠t≠-↑Y(2Z∧e`≠↓(
gNhπεEα¬∀4P
f∞}hλbBP⊂⊂⊂∪)`∃B↓H@`A≡π⊃βnβ|Y$8 3yBA
9C←M↓~β@&∞αp∩@s ` S_εG4_0→P_y3`5↓5KUI@~q↓α_¬λ∞2r 5IYfA↓λ∧ε@M<⎇⊂≥p4q@( i`&@↓`∪#∃∧↔,⎇31
nα9FEλ⊂⊂⊂⊂_βof@FαC↔hλ=\α⊂⊂ti`∂KI!Kd@9 Manipulating List Structure
Note that the constant (a b c) has now been changed to (a b c d e f). If
this form is evaluated again, it will yield (a b c d e f d e f). This is
a danger you always have to watch out for when using nconc.
nconc could have been defined by:
(defun nconc (x y) ;for simplicity, this definition
(cond ((null x) y) ;only works for 2 arguments.
(t (rplacd (last x) y) ;hook y onto x
x))) ;and return the modified x.
nreverse SUBR 1 arg
nreverse reverses its argument, which should be a list. The argument is
destroyed by rplacd's all through the list (cf. reverse).
Example:
(nreverse '(a b c)) => (c b a)
nreverse could have been defined by:
(defun nreverse (x)
(cond ((null x) nil)
((nreverse1 x nil))))
(defun nreverse1 (x y) ;auxiliary function
(cond ((null (cdr x)) (rplacd x y))
((nreverse1 (cdr x) (rplacd x y)))))
;; this last call depends on order of argument evaluation.
nreconc SUBR 2 args
(nreconc x y) is exactly the same as (nconc (nreverse x) y) except that it
is more efficient.
nreconc could have been defined by:
(defun nreconc (x y)
(cond ((null x) y)
((nreverse1 x y)) ))
March 3, 1979 ∪2-3.2 Page 2-21
Maclisp Reference Manual
using the same nreverse1 as above.
Page 2-22 ∪2-3.2 March 3, 1979
Manipulating List Structure
3.3 Alteration of List Structure
The functions rplaca and rplacd are used to make alterations in already-
existing list structure. The structure is not copied but physically altered;
hence caution should be exercised when using these functions as strange side-
effects can occur if portions of list structure become shared unbeknownst to
the programmer. The nconc, nreverse, and nreconc functions already described
have the same property. However, they are normally not used for this side-
effect; rather, the list-structure modification is purely for efficiency and
compatible non-modifying functions are provided.
rplaca SUBR 2 args
(rplaca x y) changes the car of x to y and returns (the modified) x.
Example:
(setq g '(a b c))
(rplaca (cdr g) 'd) => (d c)
Now g => (ad c)
rplacd SUBR 2 args
(rplacd x y) changes the cdr of x to y and returns (the modified) x.
Example:
(setq x '(a b c))
(rplacd x 'd) => (a . d)
Now x => (a . d)
See also setplist (page 2-55).
March 3, 1979 ∪2-3.3 Page 2-23
Maclisp Reference Manual
subst SUBR 3 args
(subst x y z) substitutes x for all occurrences of y in z, and returns the
modified copy od z. The original Z is unchanged as subst recursively
copies all of z replacing elements eq to y as it goes. If x and y are
nil, Z is just copied, which is a convenient way to copy arbitrary list
structure.
Example:
(subst 'Tempest 'Hurricane
'(Shakespeare wrote (The Hurricane)))
=> (Shakespeare wrote (The TempeSt))
subst could Have been defined by:
¬
(defUn subst (x y z)
↓ (cOnd ((eq z y) x) ;if item eq to y, replace.
((atom r) z) 9if no substructure, return arg.
((cons (subst x y (car z)) ;otherwise recurse.
(subst x y cdr z))))))
subliq ↓ SUBR 2 Args
sublis makes substituTions fh∂d@↓Ci←[%FAgs5E←YfAS\A¬\@A&5Kqae∃ggS←8\@A)!J~∀@@@AM%aghA¬eOk[∃]hAi<∪gkE1SfASLAC\A¬gg←G%CiS←8@AYSMh@Qg∃JAiQ∀@A]KahAgK
iS←\$\~∀@@@A)!JAgK
←]HA¬eOk[∃]hASLAiQJA&[KaaeKgMS←\A%\AoQ%GPAgUEgiSQkiS←9fACe∀@Ai↑↓EJ~∀@@@A5CIJ\@Agk YSfA1←←WfAChA¬YX@A¬i←[SAgs[ ←Yf@↓S\Ai!J@A&5Kqae∃ggS←8v@AS_AC\~(@@@@↓Ci←[%F@Age[E←XACaa∃CefA%\@Ai!J@ACMg←GS¬iS←\↓YSgh%←GGkIeK]G∃f@A←_@ASh↓CeJ~(@@@@↓eKaY¬GKH@↓Er@AQQJA← UKGhASh@↓Sf@A¬gg←G%CiKH↓oSiP8@@A)!J@ACIOk[K9h@ASLA]←h4∀@@@A[←I%MSKHlA]Kn↓G←]g∃fACe∀AGeK¬iKHA]QKeJ↓]KGKMgCer↓C]HA=]YrA]QKeJ↓]KGKMgCer0~∀@@@Ag↑AiQJ↓]KoYd@AGe∃CiKH↓giek
ikeJAgQCIKfACL@A[k
PA←LASif%gkEgQekGiUeJACL~∀@@@Aa←MgSEY∀AoSi @AiQ∀A←YH8@A
←H@AKq¬[aYJ0ASLA9↑@AgUEgiSQkiS←9fACe∀@A[C⊃JXAi!J~∀@@@Ae∃gkYh↓SfAKDAi↑AQQJA←1HA&[∃qaeKMgS←\8~∀@@@Aq¬[aYJh~∀~∀$@@@@!gkEY%f@NP!p@\@D``R@!t@\AiaeS[∀RR~∀$∩@@@NQaYUfAp@![S]kLANAt↓pA`RhRR~(∩@@@@@@zx@QaYUf@b`@@Q[S9kfAN↓uaeS5J@b`@A`R@PR~∀~(@@@@↓∪\@AM←[J@↓S[aY∃[K]i¬iS←]L∩Agk YSf@↓o←eWL∪Er@↓akii%]N@@↓iK[a=eCerAgkE1Sf~∀@@@AAe←aKIiSKf↓←\Ai!JACi=[SFAMs[E←1fAS\↓iQJA⊃←iiK⊂AaCSIfXAg<AEKo¬eJ\~(~∃!C≥J@dZHh∩∩∩@@@&HZf\f$∩∩@@↓≠CeG @fX@Drnr~( Manipulating List Structure
3.4 Tables
Maclisp includes several functions which simplify the maintenance of tabular
data structures of several varieties. The simplest is a plain list of items,
which models (approximately) the concept of a set. There are functions to add
(cons), remove (delete, delq), and search for (member, memq) items in a list.
Association lists are very commonly used. An association list is a list of
dotted pairs. The car of each pair is a "key" and the cdr is "data". The
functions assoc and assq may be used to retrieve the data, given the key.
Structured records can be stored as association lists or as stereotyped S-
expressions where each element of the structure has a certain car-cdr path
associated with it. There are no built-in functions for these but it easy to
define macros to implement them (see part 6.2).
Simple list-structure is very convenient, but may not be efficient enough
for large data bases because it takes a long time to search a long list.
Maclisp includes some hashing functions (sxhash, maknum) which aid in the
construction of more efficient, hairier structures.
member SUBR 2 args
(member x y) returns nil if x is not a member of the list y. Otherwise,
it retuRns the portion of y beginningwith the first occurrencE of x. The
comparison iq made by equal. y is searched on the top level Only.
Example:
(member 'x '(1 2 3 4)) => nil
(meeber 'x'(a (x y) c x d e x d)) => (x d e x f)
Note that the value retu@I]KHA rA[K5EKdAαKEβ↔
↓βS=¬##∃βε{CS'}qβ?→αβS#∃εc'OPhQ↓↓↓αβ↔∨Ns;';8β←'SBβa8&&CWMβ↔β3π∂
β?9β&C∃βK/≠W3Qε{⊃β7.k↔Iεkπeβ⊗)βWO,!1β'2βg?ThQ↓↓↓αβ≠'K≥!β∂#.≠%βSzβ7π/*βOWK*β7↔↔⊗+Iβ∪N!β;?"βK↔S-∪9β;Na84)α↓↓↓α/Cπ7Cf)h4(hP%#∂∂#∂!↓G∪C3π≡ ↓#?∩↓#7↔n∪↔Iβ@βi$4PH$%↓α↓#C#⊗{]β;Laβ3?≡)%$4PH%↓↓α↓↓↓βJH4(%α↓↓↓↓αβ3/O*H4(∀TkπK∂B↓M1↓I]d$HI↓↓↓↓→I5Ms $$%α↓↓↓↓ααCπ∨*↓I5I(h(0$$J↓↓α7∞≠3'OααK↔≠/∪↔;∂*α7π;.04λhP4)↓α↓↓β7.k↔I∧≠?W3"β#π[*β↔↔rβ∪↔≠Ns↔⊃β↔Ih4(hP%#∪.3W9βn+7↔∩↓#aβJH4(%α↓↓↓#≤{;⊃↓BC;W3bβe%βvK1$4PH%↓↓BC↔GW∞aβa↓F≠πIβJI%βeHh($%α↓!#7.k↔IπA↓#∂'⊃βe%JI↓%$hP4(4Vk↔7DHI↓↓↓¬~V
Iβ⊃βπK?_4(∀R↓↓↓↓εk↔7E∧KE↓βfK/∃βn+7↔∩a↓β↔F≠↔CQε+Eβ'~↓βWO,!β≠?∩↓βS#*β∂?7εK'O|q1↓βNsOS↔∞!β?_hQ↓↓↓αβ↔GW∞a9↓βn+7Eβ≤{W3⊃εCπ[∃ε∪↔↔9ε#↔≠'v+⊃βKP4(4PI#∪↔7+9β7.kE↓#Bβe$4PI↓↓↓αC∂?;"↓!#;.c1βeJβ;'1Hh($%α↓!#↔
βa↓#≡IβeJIβe$hP$%↓αA#7↔o βa↓F≠∪IβJI%%↓JH4(4Ph+∪↔f+S∀$J↓↓↓αe~V
Iβ⊃β?Iβ→βπK?_4(∀R↓↓↓↓αC∪↔3/#∃↓βBβe%↓π∪↔SW⊗sMβSF)↓β3O≠Q↓βJβ←'SB↓βπ3bβS?Anc↔[↔b↓β?∂∨+KK↔v≠↔M↓ε{→β`hQ↓↓↓αβK↔7␈3↔⊃9αβ↔GW∞aβ'MαβWO↔"β≠?Iπ##∃β≡{7Cπ⊗KO?9r↓↓αSF)βπK?+7↔;"βe↓βO→βπ∂'+π33Hh)↓↓α↓β7?&K≠'↔"↓#KCf∂⊃∨.!%β←F+9β'w≠Sπ;≡+M↓β}1βaβ∂∪∃βOεc'∂↔"β?WQr↓↓β∪.c↔S∃π≠#?Wf 4)↓α↓↓β*βWO↔"β≠?Iπ3π3W*aβ;?"β≠?Iε+≠≠↔∨!9↓α&CπQβO→1βW≡(4(4PI#O↔' β¬↓F#↔3↔&)↓∨ ε %$4Ph('K∂##↔Iπ##π8hP4(%F#↔3↔&)↓∨ ε %$4Ph(4(M##∃βfSS↔∩β'Mβv{Qβ↔∂+'[πf+;Qβ>C↔9↓π##∃β6KKOQε+3↔7.sQβ?2βS#∃π3π3W*↓β?→ελ4('O→β 8hP4)↓α↓↓↓#&+3↔S*βaβeεq%β'~β3'/*↓#∪↔f+S∃βBβe%β/C∂↔C"β?;3JβS#∃ε3'KO"β9β'w≠Sπ;≡+Mβ?2β`4)α↓↓↓β∂∪∃β∪.c↔S↔"q↓β9εKMβπfc?←↔"βS=β⊗)βk↔⊗y9↓αN1β9βO→β∨K.S↔Iπ##π9π##∃βw+7↔∩β?_4R↓↓↓↓ε{∂∂W↔∪↔;∂/→β?→πA↓β'rβS#∃εc'OQb↓βπ3bβ?∂∂/∪K↔;≡+Mβ?2βa↓βNqβS#*β3'O K←'3bβ∀4R↓↓↓↓ε#↔3↔&+⊃84Ph)↓↓α↓α↔c∞kC3∃Ph(4(hRCπ∨*↓I5I0H$%↓α↓MIk→9P$HI↓↓αnK∂!β→1↓EK9d4(0$$J↓α7πvKCW3∂#';≥∧c'OQ¬≠SKW∨#WK∀hP4(4Ph(%#&+3↔S*↓∨¬↓:C β¬ε→↓#¬ε⊃%β⊃ε β∃%J↓uy↓F⊃β
↓F β %ε!β∃$hP4('&+3↔S*β∂?Wf!β#π6)β↔.qβ∪↔6K;↔⊃ε∪eh4Ph(%#&+≠W9ε#↔3↔&)β;π⊗;L%↓α↓mβ3/CCIβ6{I↓Iε{I↓MεK∨LhP%↓↓α↓#∪↔f+S∃EαCπK≥β $%↓α↓mβC∂≠Mβπf{;≥β∂∪∨W7.sSM9rp4($J↓↓↓↓αCπK≥β⊃$4(HI↓↓↓α↓#∂?v!↓!!jβ;πK?→↓M%αCπK≥β→%$4PH$%↓α↓!EI≠!UY]CI9%%JI↓mβNs≠';O#d4(hP%#∪.3W9β&+3↔S+ ↓#aπIβ9$J↓↓↓↓β[πWcNc'πKJβ≠W;∨#'?8hP%↓↓α↓#∂?v!↓!#␈⊃↓#;.c1βeJ↓#k↔⊗{Aβ9JIβe$hP$%↓αA#↔G.1βaαC∂πIπI%%↓F#↔3↔&)Eβ`hP$$$HI↓↓↓α↓↓#∂'⊃βe$hP$$$HI↓↓↓α↓↓!Ejβ9%%Hh($%α↓!#Kεcπ∂⊃πI↓#∪.c↔S∃
βa↓#≡#IβeJβ9%%JI$4(hP4+∪.cD$%α↓↓α2≥*
I↓∩β?I↓~βπK∨_h(4)α↓↓↓β&+3EβO→↓βSF)βOπn('πMε#↔3↔&)↓β↔F≠↔CQπ##πPN+Eβ'~↓βWO.!β≠?∩↓βS#*β∂?7εK'O}p4)↓α↓↓β'w≠S↔π"β?→β/Wπ1ph(4(hSOc#∂≠ $%α↓↓αN,∩I↓EεK≤4Ph)↓↓α↓βOcFO!↓ε≠?7C/#↔Mβ
↓β#π≡Aβ∂?&)↓β?0Kπ9α~k↔cC⊗+OO'}q1↓β∞s⊃βK/#WK;~↓β'QαβπMβλh)↓↓α↓β≠'FsW51π;#'∂Bβ7πeε∪∃βC␈≠'S'6)↓β?∩β;↔∨∂#'[∃r↓α¬βπ∪?C↔↔#eβ?2βOc#∂≠ ''~βS#π h)↓↓α↓↓#↔∂+π1βB↓βe%εK7C3N+M↓!j↓↓#OFCπO!πA%↓#∨C#πOB↓βe%Jp&S#*β;W7⊗+I↓β⊗+SWKv+⊃βHh)↓↓α↓βOcFO!βO→βO?n)βC?∨≠'3Jβ3πK>)β;Wn∪↔IβNqβS#*βKπ;>)βπ3f{←↔⊃ε∪e↓β6Kc;Wo→9↓αO 4)↓α↓↓β'~β∨Wπ⊗;S↔.!βS#∂!h4(hQ↓↓↓α↓E%β∨C#πOBβ≠?Iε9βπ&{7'
π≠g7}aβ←'faβπ3>gMβ⊗)βC?≡KS'[*p4(4R↓↓↓↓β⊃%βOFCπO!ε{→↓β∞seβC∂∪S'∂.cπIβ/CCK↔∨≠'?9π;'31αβ∃β≤{;OS∞sQβ'r↓β¬βεKS'∨+3πHhQ↓↓↓αβ'7Cf+7↔;&S'?rβ≠?Iε31β&K7∃1πβK?∞∪3e8hP4)↓α↓↓↓MJ↓αS←z↓β∪'63↔K↔w!↓β'oβ3↔7.sSπSN{;M↓εkπe↓εCπO!αβS#∃αβOπ7(K↔cC⊗+OO'}qβ';&x4)↓α↓↓β∪N3≠↔K.sQβ[∞cW↔Mph(4)α↓↓↓↓"IβOcFO!β}1βπ;Jβ?+.≠Qβ?2βSgC*βKπ;&{5β←Nc1β*βk↔Kzp4(4Ph*7π⊗≠!↓Mb↓Ee]HH$%↓α↓MIk→9P$HI↓↓↓α↓↓αC∞;∃↓Ik⊃\4(0$$J↓↓α7∞≠3'OααK↔≠/∪↔;∂*α7π;.04(hP4)↓α↓↓↓UJβOc#∂≠!β?2β¬β≠OC;W5π;'31βiβS#∂!β≠'FsW58hP4(&F+K∃βO→βπ9ε+cπ7εc∃β?2β#?]π#=βW≡)βOcFO!βNqβ7πNsSπ'vK;≤4PK#πOBβSπf+Mβ?2αM7↔GβK↔O≡K?;MPh(4)α↓↓↓↓F#↔≠Wrβ/;?>sA↓#BH%↓↓↑c??-π+AβaεK9βSF)βSπ⊗c∀4)α↓↓↓↓α↓#CK}9↓#%ε∪/Q$hP%↓#≡+SEβJ↓#C3/→↓]YαCK↔7∞K;∪↔∩↓#OcFO!βBI↓]]JI$4(J↓↓↓n&C∃βK.kπ';&+IβOF{W3⊃ε∪∃βK.O?;∞∪3eβ⊗;∪?nKk↔⊃ε∪↔S←.+84(J↓↓↓m6 and 76, thus table size must be > 175 octal.
(setq bkt (table i))
;bkt is thus a list of all those expressions that hash
;into the same number as does x.
(return (member x bkt))))
To write an "intern" for S-expressions, one could
(defun sintern (x)
(prog (bkt i tem)
(setq bkt (table (setq i (+ 2n-2 (\ (sxhash x) 2n-1)))))
;2n-1 and 2n-1 stand for a power of 2 minus one and
;minus two respectively. This is a good choice to
;randomize the result of the remainder operation.
(return (cond ((setq tem (member x bkt))
(car tem))
(t (store (table i) (cons x bkt))
x)))))
assoc SUBR 2 args
(assoc x y) looks up x in the association list (list of dotted pairs) y.
The value is the first dotted pair whose car is equal to x, or nil if
there is none such.
Examples:
(assoc 'r '((a . b) (c . d) (r . x) (s . y) (r . z)))
=> (r . x)
(assoc 'fooo '((foo . bar) (zoo . goo))) => nil
It is okay to rplacd the result of assoc as long as it is not nil, if your
intention is to "update" the "table" that was assoc's second argument.
Page 2-28 ∪2-3.4 March 3, 1979
Manipulating List Structure
Example:
(setq values '((x . 100) (y . 200) (z . 50)))
(assoc 'y values) => (y . 200)
(rplacd (assoc 'y values) 201)
(assoc 'y values) => (y . 201) now
(One should always be careful about using rplacd however)
A typical trick is to say (cdr (assoc x y)). Since the cdr of nil is
guaranteed to be nil, this yields nil if no pair is found (or if a pair is
found whose cdr is nil.)
assoc could have been defined by:
(defun assoc (x y)
(cond ((null y) nil)
((equal x (caar y)) (car y))
((assoc x (cdr y))) ))
assq SUBR 2 args
assq is like assoc except that the comparison uses eq instead of equal.
assq could have been defined by:
(defun assq (x y)
(cond ((null y) nil)
((eq x (caar y)) (car y))
((assq x (cdr y))) ))
sassoc SUBR 3 args
(sassoc x y z) is like (assoc x y) except that if x is not found in y,
instead of returning nil sassoc calls the function z with no arguments.
sassoc could have been defined by:
(defun sassoc (x y z)
(or (assoc x y)
(apply z nil)))
sassoc and sassq (see below) are of limited use. These are primarily
leftovers from Lisp 1.5.
March 3, 1979 ∪2-3.4 Page 2-29
Maclisp Reference Manual
sassq SUBR 3 args
(sassq x y z) is like (assq x y) except that if x is not found in y,
instead of returning nil sassq calls the function z with no arguments.
sassq could have been defined by:
(defun sassq (x y z)
(or (assq x y)
(apply z nil)))
maknum SUBR 1 arg
(maknum x) returns a positive fixnum which is unique to the object x; that
is, (maknum x) and (maknum y) are numerically equal if and only if (eq x
y). This can be used in hashing.
In the pdp-10 implementations, maknum returns the memory address of its
argument. In the Multics implementation, an internal hash table is
employed.
Note that unlike sxhash, maknum will not return the same value on an
expression which has been printed out and read back in again.
munkam SUBR 1 arg
munkam is the opposite of maknum. Given a number, it returns the object
which was given to maknum to get that number. It is inadvisable to apply
munkam to a number which did not come from maknum.
Page 2-30 ∪2-3.4 March 3, 1979
Manipulating List Structure
3.5 Sorting
Several functions are provided for sorting arrays and lists. These
functions use algorithms which always terminate no matter what sorting
predicate is used, provided only that the predicate always terminates. The
array sort is not necessarily stable, that is equal items may not stay in their
original order. However the list sort is stable.
After sorting, the argument (be it list or array) is rearranged internally
so as to be completely ordered. In the case of an array argument, this is
accomplished by permuting the elements of the array, while in the list case,
the list is reordered by rplacd's in the same manner as nreverse. Thus if the
argument should not be clobbered, the user must sort a copy of the argument,
obtainable by fillarray or append, as appropriate.
Should the comparison predicate cause an error, such as a wrong type
argument error, the state of the list or array being sorted is undefined.
However, if the error is corrected the sort will, of course, proceed correctly.
Both sort and sortcar handle the case in which their second argument is the
function alphalessp in a more efficient manner than usual. This efficiency is
primarily due to elimination of argument checks at comparison time.
sort SUBR 2 args
The first argument to sort is an array (or list), the second a predicate
of two arguments. Note that a "number array" cannot be sorted. The
predicate must be applicable to all the objects in the array or list. The
predicate should take two arguments, and return non-nil if and only if the
first argument is strictly less than the second (in some appropriate
sense).
The sort function proceeds to sort the contents of the array or list under
the ordering imposed by the predicate, and returns the array or list
modified into sorted order, i.e. its modified first argument. Note that
since sorting requires many comparisons, and thus many calls to the
predicate, sorting will be much faster if the predicate is a compiled
function rather than interpreted.
March 3, 1979 ∪2-3.5 Page 2-31
Maclisp Reference Manual
Example:
(defun mostcar (x)
(cond ((atom x) x)
((mostcar (car x)))))
(sort 'fooarray
(function (lambda (x y)
(alphalessp (mostcar x) (mostcar y)))))
If fooarray contained these items before the sort:
(Tokens (The lion sleeps tonight))
(Carpenters (Close to you))
((Rolling Stones) (Brown sugar))
((Beach Boys) (I get around))
(Beatles (I want to hold your hand))
then after the sort fooarray would contain:
((Beach Boys) (I get around))
(Beatles (I want to hold your hand))
(Carpenters (Close to you))
((Rolling Stones) (Brown sugar))
(Tokens (The lion sleeps tonight))
sortcar SUBR 2 args
sortcar is exactly like sort, but the items in the array or list being
sorted should all be non-atomic. sortcar takes the car of each item
before handing two items to the predicate. Thus sortcar is to sort as
mapcar is to maplist.
Page 2-32 ∪2-3.5 March 3, 1979
Manipulating List Structure
3.6 Hunks
This section applies only to the pdp10 implementation.
Hunks are a generalization of conses, useful in constructing more efficient
data structures. A hunk is like a cons but it has more components; hunks come
in several convenient sizes. The advantage of an n-element hunk over an n-
element list is that the hunk occupies less space (half as much if n is a power
of 2). The elements of a hunk can be referenced more efficiently than the
elements of a list, since the compiler knows the relative locations of the
components and addresses them directly.
The advantage of lists over hunks is flexibility; lists can be any length,
can vary in length, can be altered by rplacd, and can be manipulated with a
library of useful searching, sorting, and combining operations, previously
described in this chapter.
Another feature of hunks is that at times one may treat a hunk as a cons,
ignore the extra components. This allows the construction of list structure
which has extra "frobs" stuck on at certain points. The atom function does not
consider hunks to be atomic; it returns nil if given a hunk.
print represents hunks using an extended form of dot-notation; read however
does not yet understand this notation. See the writeup on print.
hunk LSUBR 0 or more args
hunk takes any number of arguments, and returns a hunk whose components
are the arguments. The first argument is the car, and the last is the
cdr; that is, the arguments are in the order 1, 2, 3, ..., N-1, 0. This
is the same order as print and makhunk use.
The maximum size of a hunk is 128 components. This may vary from
implementation to implementation.
With no arguments, hunk returns nil. With one or two arguments, hunk
returns a cons.
March 3, 1979 ∪2-3.6 Page 2-33
Maclisp Reference Manual
cxr SUBR 2 args
(cxr n h) returns the n'th component of the hunk h. car of a hunk returns
the 1st component, and cdr of a hunk returns the 0th component.
rplacx SUBR 3 args
(rplacx n h z) replaces the n'th component of the hunk h with z. The
value of rplacx is its (modified) second argument. rplaca of a hunk
replaces its 1st component, and rplacd of a hunk replaces its 0th
component.
makhunk SUBR 1 arg
¬
(makhunk n), where n is a fixnum, creates and returns an n-element hunk,
filled with nils. (makhunk l), where l is a list, creates and retqrns a
hunk of the appropriate l@∃]OiP0@AS]%iSCY%uKHA→e←ZA0X@A)!SfASL@AYS-J@ACAaYr~(@@@@OQk],AXR\4∀~∀@@@A→%WJAQU]VXA5CWQk9VAoS1XAeKQke\A9SXA←H@ABA
←]fA%LAs←TACgV↓M←dA∧AQk],@A←L`X~∀@@@@DXA←ddAKY∃[K]iL\~∀~(~∃Qk9WgSu∀∩@@@↓'+¬$bACe≤~∀~∀@@@A!k]Wg%uJAe∃ike]LAiQJA]k[ KdA←_AG←[A←]K]Qf@AS8ASif↓CeOk5K]h\@AQk9WgSu∀A←L~(@@@@↓]SXA%f@`A¬]HAQU]WgSiJA←L↓BAG←9fASfd\~∀4∀~∃QU]W`∩$@@@AYβ%∪β →
~∀4∀@@@A∪LAQQJ@AYCYkJ↓←L@A!k]W`↓SfA]%XX@AQQJAMU]GiS=]f@AAeS]h0AKck¬XX@A¬]HAaUeG←ad~∀@@@Aie∃Ch@A!k]Wf↓Cf@A
←]gKLXACfA[←gPA←iQ∃d@AgegiKZ↓Mk]GQS←]f%I↑\@A)QJ↓Kqie∧~∀@@@AKY∃[K]iLACeJ↓gS[a1rASO9←eKH8@A∪LAiQJ↓mCYk∀A←LA!k]W`↓SfA]=\[]S0X@Ao!SGPA%f~∀@@@Ai!JAIK→CkYh0@AiQ∃gJAi!eKJ∪→k]Gi%←]fA⊃KCXA]SiP@↓CYXAQQJ@A∃YK[K9if\@↓gqQCMP~∀@@@AC1oCsf↓IKCYLAoSi ACYX↓iQJA∃YK[K9if\~(~∀~∀4∀~∀~(~∃!C≥J@dZLh∩∩∩@@@&HZf\l$∩∩@@↓≠CeG @fX@Drnr~( Flow of Control
4. Flow of Control
Maclisp provides a variety of structures for flow of control.
Functional application is the basic method for construction of programs.
All operations are written as the application of a function to arguments.
Maclisp programs are often written as a large collection of small functions
which implement simple operations. Some of the functions work by calling
others of the functions, thus defining some operations in terms of others.
Recursion exists when a function calls itself. This is analogous to
mathematical induction.
Iteration is a control structure present in most languages. It is similar
to recursion but sometimes less useful and sometimes more useful. Maclisp
contains a generalized iteration facility. The iteration facility also permits
those who like "gotos" to use them.
Conditionals allow control to branch depending on the value of a predicate.
and and or are basically one-arm conditionals, while cond is a generalized
multi-armed conditional.
Nonlocal exits are similar to a return, except that the return is from
several levels of function calling rather than just one, and is determined at
run time. These are mostly used for applications such as escaping from the
middle of a function when it is discovered that the algorithm is not
applicable.
Errors are a type of non-local exit used by the Lisp interpreter when it
discovers a condition that it does not like. Errors have the additional
feature of correctability, which allows a user-specified function (most often a
break loop), to get a chance to come in and correct the error or at least
inspect what was happening and determine what caused it, before the nonlocal
exit occurs. This is explained in detail on part 3.4.
Maclisp does not directly provide "hairy control structure" such as multiple
processes, backtracking, or continuations.
March 3, 1979 ∪2-4. Page 2-35
Maclisp Reference Manual
4.1 Conditionals
and FSUBR
(and form1 form2...) evaluates the forms one at a time, from left to
right. If any form evaluates to nil, and immediately returns nil without
evaluating the remaining forms. If all the forms evaluate non-nil, and
returns the value of the last one. and can be used both for logical
operations, where nil stands for False and t stands for True, and as a
conditional expression.
Examples:
(and x y)
(and (setq temp (assq x y))
(rplacd temp z))
(and (null (errset (something)))
(princ "There was an error."))
Note: (and) => t, which is the identity for this operation.
or FSUBR
(or form1 form2...) evaluates the forms one by one from left to right. If
a form evaluates to nil, or proceeds to evaluate the next form. If there
are no more forms, or returns nil. But if a form evaluates non-nil, or
immediately returns that value without evaluating any remaining forms. or
can be used both for logical operations, where nil stands for False and t
for True, and as a conditional expression.
Note: (or) => nil, the identity for this operation.
cond FSUBR
The cond special form consists of the word cond followed by several
clauses. Each clause consists of a predicate followed by zero or more
forms. Sometimes the predicate is called the antecedent and the forms are
called the consequents.
Page 2-36 ∪2-4.1 March 3, 1979
Flow of Control
(cond (antecedent consequent consequent...)
(antecedent ...)
... )
The idea is that each clause represents a case which is selected if its
predicate is satisfied and the predicates of all preceding clauses are not
satisfied. When a case is selected, its consequent forms are evaluated.
cond processes its clauses in order from left to right. First the
predicate of the current clause is evaluated. If the result is nil, cond
advances to the next clause. Otherwise, the cdr of the clause is treated
as a list of forms, or consequents, which are evaluated in order from left
to right. After evaluating the consequents, cond returns without
inspecting any remaining clauses. The value of the cond special form is
the value of the last consequent evaluated, or the value of the antecedent
if there were no consequents in the clause. If cond runs out of clauses,
that is, if every antecedent is nil, that is, if no case is selected, the
value of the cond is nil.
Example:
(cond ((zerop x) ;First clause:
(+ y 3)) ; (zerop x) is antecedent.
; (+ y 3) is consequent.
((null y) ;A clause with 2 consequents:
(setq x 4) ; this
(cons x z)) ; and this.
(z) ;A clause with no consequents:
; the antecedent is just z.
) ;This is the end of the cond.
This is like the traditional Lisp 1.5 cond except that it is not necessary
to have exactly one consequent in each clause, and it is permissible to
run out of clauses.
March 3, 1979 ∪2-4.1 Page 2-37
Maclisp Reference Manual
α
4.2 Iteration
prog FSUBR
prog is the "program" qpecial form. It provides tempopary variables,
sequaftial evaluation od statemeNts, And the ability tk do "gotos." A prog
looks something like
(prog (rar1 var2,∧\\R4∀∩Ai¬Nb~∀$@@@AMiCiK5K]hb4∀∩@@AgiCQK[K]Pd~∀∩↓iCNd4∀∩@@AgiCQK[K]Pf~∀∩@@@\X@\~(∩@@R4∀∩∀@@@Am¬dbXAYCddX@\\\↓CeJAQK[a←β∪πKeαβ[πKL3↔~q↓α←F+9βSF)↓βC⊗{≥β'~↓β↔≠&+K↔⊃π##∀4R↓↓↓↓π3π3W/→β/_LεFF/<Tπ6∂-_⊗⊗f↑4ε∂⊗T∧π∞∂lX ¬Dλ∃z]H≥~Tλ≤⊂→≠pπ iS exi@QKH@AQQKrA¬aJ
∀@@@AIKgi←IKHL∪QQJAm¬aSCE1KfACIJAS]%iSCYαKk↔⊃¬#5β;L¬Bπ≡YbπεTππ⊗|pλ∧
<h⊃-n→<Y,Eβ"H∧∧λλ~~8¬s @QQKrA¬aJAgα'↓β&yβ∃α↓βx
↔→⊂:7P≠4r↓ bq the proe @@↓⊃@?←-3↔I1∧εf∂⊗α88ML<c"D∧λλλ∞⎇~8r∧
_0% bee8AIKFεcπK⊗ ∧εm>≠]-T≠x ⊂_ε` ←]UZAoSαc "ε,TεNv_¬~,≥~:AD≥≠hε∧λ≠`→λ_⊂∞`4⊂ ↓↓α↓β'≠_εF.∞EDαε↔↑@λ
⎇Xε4Pλ4p∞ compIhed A`∂≡ε,⊗o~βHλ∧8π`∃ pπ@#?αPDλ_Y$∧_p<L\β2f⊂_q0∂@*π (↓Hλλ∧∧≤Y0⊗≡p `≥∞αβ?9β&C∃β'vKC'πbβ[πH
2λ0∂f A`}p5L≡X∧pq~2qWεBα~(α↓↓↓ααMε*π≡'D≠yH∀≤≤[l@P0s4er the te@5a@∨K∂∪eβZ∂∪'π`∧Rε~0`:λ4qP4he @E=Ir\∪¬XAS&+ (hα@λ∧∧λ∩ ↔λ8∧hE b`∂I↓Hβ .∂⊂λλLT_;@⊂_z7vtXP9|`-b`∂X↓¬w$_ 7≤tq2@r, whia` ILABAi¬@
" pD(⊂↔'[⊗@
¬a@∨6¬⊂λDXπ`∩m, whic` I@LABAfπ#πC⊗¬XVwλπεEα¬∀@@@Aae9H
b∧λ,8∧er@AERαs∪'hpλ∧∞α4"Pλ8∧e@[A←eC↔I↓↓β0∧↔-88[↑hε pr`∨Fα+@∨≡↑4ααε_¬≤d∧_[`∩≡D@
@@@Afε+GW⊗u#'πM@∞%⊂⊂:0Xβs ¬`∃β_¬6Oπλ ∩λ0πve↓Hp
↓↓∞7ε∞¬→0⊗Yu2 ∪ are ↓∃iC@2εP_.9α 1≤¬pλAi!J∩(∧∧ααα∞`_-∞αryP_y2Ph`∂]@>ε,F"r∧ εd≥~⊃∧8π $o`Ai!JAE←α#eβ&α4π,88`4→p∧ _↓∞π,πs@ p¬K@RεP≤MNh∪Z-↓↔
H`∧@@#⊗+C@.∧[@⊂≡⊂ @Rπ→β↔↓h≥G\8
2@$, prndεAgi=afA`π∪7∂↔≤ε6NVpλ∀≤9P!7Y<P !nd reQ`↔Kn4πεFQQ"αα∧∧π&∞β⊂~@d p⊂@9αα'2∧¬ε=h≥_,@TP )↓L∪@↔↓hλ;∞↓pr2`$, prndεAU(
Wπ~∞MrαπMBπε_]∧πs⊂⊂≤42P"o` @DhQ↓↓↓αβ &∞,P
↓2r6¬SaP@β##∃β&⊂~@Hλ∃
(⊂<Lxp
@JεsA↓β&yβ∨≤¬↔4≠S`:λ2s v≤¬ade@⊂A`↔h∩\βs %`⊃β&ε1P@$λλλ∧π0∂n5Ci←[%F@_Q!P@$λλλ∧λ8
sh`∂k_α!β∃¬f␈&X@λ∞↓40`4↓`∪#∃αα7π∞`¬π>λ≤9≠pπ @Rπ→βπd→/∞α2`.sikf ↓=@→βSF)↓αM⊂n∧λ#@~BA⊂⊂⊂λ⊂897→β _A∩αqβ@&≡Bαε⎇tw4_;Y∧∞Y=≥.0ε'@fA@↔πβ∀ε}≡>Z"εNβHλ
≥|Y(∞α0q`$pεAiQ¬\@A→αK@∨α ↔
F@
alh @?←,∧Bbα
w>8"`2, the Lic@@AG←[ASYKeLAS@7∧c↔7↔w#↔↓βx¬b∧MJ5B∧o]@
≤|kλ≥Y⊂~~2BE⊂λ⊂⊂⊂"⊃ay|`3te`~∩D`AM↑β⊂&'π≤c'OAαβC↔G,¬↔,(≥~≡λλ⊃mt|h⊂⊂[2⊂⊂)→z:y7 yP⊂!→P62l~qpv6≡FEεEβE(0sYP→⊗IN∧@DPλ⊂⊂ YZ∪→∧BDP⊂⊂∪py1tλ→R⊂_N[\FEβ∧DDDQ67{P≠s⊂!w[:97vβEεEεB⊂⊂⊂⊂λ;tz4~w⊂:4→P9qw\2P7sλ:42P≤97sWλ*44yH6pur\P0P3≥w1z4[w⊂;t~qt⊂2≠ryP7≠z⊂1w[:0twβE⊂⊂⊂λ⊂0P(≤7sV⊂_:z⊂;Z4qt⊂→7ryP_ww:0Zw⊂0@→wP7yλ92z:\7⊂:w_wvx4[0q62KεEεEλ⊂⊂⊂⊂∀rrP0[9wP:~2P27H9x2qZpv⊂3≠y6V⊂≥t4qtλ:yryH0P17Y<P9t[tv0yλ:7P8≤7sW∧U42P2≠VεE⊂λ⊂⊂⊂1Xz1t⊗λ0w2⊂≥497{H⊂9x2Xtpv⊂→4πrms are included in Maclisp as an attempt to
encourage goto-less programmiNg style, Which leads to More readable, more
easily mai`≥i¬S]KHAG←I∀\∩A)!JAae=OeC[5Kd@A%b@Ae∃G←[[∃]IKHAi↑@↓kgJAQQKgJ4∀@@@AMk]
iS←]LAS]gQKCHA=HAae=NAoQ∃eKmKHAeKCM←]CE1J\~∀4∀@@@AqC5aYJT4∀~∧∩!ae←NQpAr↓tR@@mpXAr0AtACIJAae=NAmCISCEY∃`
↓↓jβC↔7ε{@⊗∂-≤W
pQ!∩αα¬∞6/'∀∂∩αF<≡"π:∀"αF<N"π:∃⊃ααβ>tεO~⊂ε'⊗\Tπ6∂-_⊗⊗fUaPPNM⎇wh!∀ααα1vv"¬¬εw.MDπJJ¬∞&/'↑-bπB⊃⊃PPH∀¬αFw]IBπR∀¬ε>zZ'αJ∃⊃PPO,]&}NaQ Jα∧¬π≡/N∀πBα9vw~¬6}w4¬ε≡∂$λ∞%∀λ_p.$≡J*!QB""$∂
*#!!(λλ¬∞y=≤$∂(
_lNH≡*!Q@"(∂$
_q∞$≡J*!Q@ λ∧¬→{h
M{|
!Q@9<N↓ B(∧∧
_\L\:h_.,+>;nU<⎇<LWh≥
!Q@(λ∧¬≤y=∞∀≤H≡%⊃"B(∧∧
→{d∞Y:[m≥J*#!!"C"LMb"(∧∧λ⊃TjXTC"AQHλλ∧∧∃~→$≠hλ∞>→8r,≥λ→[n-(≤≤M}Z9→.4λ_ |;Y4L≥~>Y,DλY≠d∧≠≠{n∧H→P,=;~=∂∃α=z.Mλ_;AQHλλ∧∧_<XM≡≤X<O∀≠];,,<H⊂↔Yα "index varaables" whose valu`fA¬eJAg¬mKHA]QK\@↓iQJA⊃↑~∀@@@ASLAK]i∃aKHA¬]HAe∃gi←e∃H@Ao!K\ARβ!β'Mεc↔≠Qbβ%;∃r↓βS#/IβπK*β?Wv!βdO##∃β&y8$)α↓↓↓α&C∃β'v#↔`'6K'π⊗c↔Mβ∂∪∃βW≡+⊃↓βNqβS#*β'S↔⊗S'?r↓βC↔⊗3?K7,!βe∧#=8%∧QβSF(4)↓α↓↓β.;';;Ls≥βSF+eβπ⊗)β';M#'π3OS↔⊃β&yβOC.≠'≠'.!β[πg+↔M1∧;⊃β&C↔9β∂!βS#*β↔;⊃ε{_4)α↓↓↓β.∂!β'∪'Aβ∂∪?W; ↓βS#*β3/?αβS#∃π3π3W/→↓β?2βS#∃εK;∪↔Bβ[πKN3↔~↓βπK*β∂#πv;↔⊂4R↓↓↓↓ε∂∂?⊗#';≤O#=βOε+∂'≠N+⊃↓β↔+3↔Mr↓↓β∪zβπ33␈;E↓β&C∃βC⊗{∨Kπnk↔I↓π#=↓β∨β↔∂'7Iβ∧4R↓↓↓↓πβK↔∪N≠πS∃π;#'∂Bβ∪↔S/∪7';/→β←#.q↓βSF)β'S/∪πS'}qβ←'faβS↔⊗k';π&)9↓↓¬##∃β63W∀hQ↓↓↓αβS-β⊗)βK↔'+K;↔"βπMβ&C∃βK/≠W3Qε{→βSF)β≠?⊗iβ7πJβ?CSN{;π3gIβ∃π≠C↔∂N3'↔⊃ph(4)α↓↓↓β&yβ∂?n+Mβ'rβS←=π3πK'/#'↔Mph(4(hP4*7∂∪∂!↓~a↓Ee;H$$%α↓↓M∩iQ9HHH%↓↓α↓↓↓αε∨∃↓∩iMd4P0$$J↓↓α7∞≠3'OααK↔≠-∪↔;∂*α7π;.04λhP4)↓α↓↓αSF)β;↔>+Iβ[∂∪'↔SJβ?→β&yβ3?}[Mβ3N[∃h4Ph(%#&y↓!#6Iβ'vKQβK/β↔πQJq99$hP%↓↓α↓#↔; kS↔O"β↔c'"k≠?Kjq99$hP%↓↓αβ?∪Jq99$hP4)↓α↓↓αSF)↓β≠M∪GQβO#↔5↓∧K9βSF)↓β≠⎇∪5β'~↓β¬βdKOQ↓ε{⊂∩π,↑&xN|$εn␈,TαεNlLWBπl≡&N∞-LPhR∧∧ααπ>V≡Nm≤W.kHλλ\8zα-≥Y→6∧∞X<Z,≤Y→".≡→8r,@4ry⊂~yP0D[4yz≠s⊂⊂*~2P70[pP⊂'Y⊂0FEλ⊂⊂⊂⊂≥0y4`X42P+_y⊗⊂!n iNitial value init, which defaulp fAQ↑A]Rαa↓↓
pD∞≠x|m≤Y≡#!∧λλλ∧∂Y<[eDλ_<d
9;]
≥{Y9∧∧≥;Y↑H≤→≠qT@⊂~q⊂⊂ )p is kmi@QaKHX↓C]H∪∧@AeKAKChAβ3π3W(h!↓↓α↓βK↔∧+πQ→αα'2∞,Wε.≡@εO~
x-≡≥→1¬D≥~→$∞X<@
≡h≠[nD_z_-ly9⊂_2z;rYw⊂6 /ops.
λ
α All asqignment t`∞Ai!J@ASαs∪↔aαβ[πKL#↔_K'Mβ&{;∃↓∧K9↓β∧KπMLVbp∀λ↔"πMPhR∧∧ααε,\vNvm⊂LT≠yH∞M→(λm<\u∧
=→<L≡~;{ED_;≠∧∞~→(∧
;Z0~≤P0y2H2{0v≥pz2r⊂⊂:4→w⊂:4→FE⊂⊂λ⊂⊂;0\9P0y→P9p{→r⊗⊂ 4hen the vars are seTq'edth∞Ai!JAmC1k@↔Mε{⊂∩πMRαε≥m↔'~d∧¬&xQ$ααα∧∞π/"
~Bε∞mzFF/$
v∂JD∞FF*∞l↔↔~≡&*εL≥V⊗&∃\&␈.l@π&Z∞Mε*πl≥G.<h≠l@⊂⊂:4→P4w4]9WεEλ⊂⊂⊂⊂∪4πte that the ifiTq abe evaluated befOpe the vars are bound. At The
beginning of each succeeding iteration those varc thathave repeats get
setq'ed to the valeeq of theip∧@Ae∃gaKGQSmJAIKaKCQfD@@↓≥@∨S*βS#π Kπ31π##∀4R↓↓↓↓¬∪↔C↔∂#Mβπ⊗)β↔[∞cWπS.!β↔4{C∃β∞seβ?2βS#∃π3πKMεK@~ε9⊗v>\@AQ@εE⊂λ⊂⊂⊂*~2P9rXww2→v2vr[:⊂7cλ⊂:42H27Vs≠y2P4\P0P⊂≠4yz≠q⊂0wλ2w2 pesting prediCate
end-test And zep¬↑A←HA[Oehe valqe od∧AiQ∀AI↑A%fAiQ∀AmCYUJA←L↓iQJ∩1CghA∃qSh[→←eZX4∀@@@A←dA9SXAS_AiQKβ∪∃β←-∪∃β;z↓β↔cM!7≠x-W~Hλ∪M}→(≥
=λ⊂~~2P9rXww2→v2vr[:⊂⊂7Yα the
do-dkrmp¬KgKαk#↔~β¬β∞x¬f"ε=@λ.↑y+C!↓αA⊂⊂λ⊂⊂$cλ842P≤p¬co9HAKXα+7.β]
|β⊂:4→P⊂3 /p¬BA∩β→βπbaβC#(ε&*ε≤4εvzXLE=→<nDλ≠[n⊂2|4]⊗@
→←e@7~aβπh@λ∞M→(⊂M|_(⊂↔Yα the do is eaKGki∃HA←]1rA←]
JP→↓∧K9βSFKEβSLεε*α
x D≠c"D∧λλλ
≡λ~0→H0s⊂2\αrg@$↓aP≥βF[∃β⊗+C↔π'→1↓↓¬##'M¬#gC∃∧{⊂∩εMtεO~⊂λ∧897`' wiTh initial
ralues ≤D4∀∩)α↓↓↓αL1βS#*β@≡8{sLD→;∩Zp¬`≥h↓←DAi!J@AMα{C¬αHε2πεT¬~n←∞πε/>9⊗}r¬
fNb∃Dπ&F↑,Rαε≤4εvxQ$ααα∧λVv"↑LW∨"
z"ε/
~Bn6β|[.∃λ_;LD≥~→$Xπr<H5s⊂*~2P27H4yP2↑2qzz→r⊂7`6er and over.
This is a "do fcrever." The infiNite lkop can be teriinated by use of
return oR throw.
The remainder of the do-form constitutes a prog-body. When the end od the
body is reached, the nexp iTeration oF the do begifs. If retuRn is useD,
do returns the iNdicated value and no more iterations occur.
Page 2-40 ∪2-4&2 March 3, 1979
Flow of Control
¬
The older variety @=LAI↑↓Sft~(~∀@@@@QI<AmCd↓S]Sh↓aKaK¬hAK]⊂[iKgPAE←Id\\\R4∀~∀@@@A)!JAMSIghAi%[JAi!e←kO AiQJ↓Y←←`↓mCdA≥KifAQQJAm¬YkJA=HAS]%hv@AQQJAe∃[CS]%]N~∀@@@AQS[Kf↓iQe←UOPAi!JAY←=`ASh↓OKif↓iQJAYCYkJ↓←LAe∃aKCh0AoQS
P∪Sf↓eJ[KYCYkCQKH~∀@@@A∃CGPAQS[J\A≥←i∀AiQCPAS]SPASfA∃mCYk¬iKHA KM←e∀AiQJ↓mCYk∀A←LAYCd@A%fAgCYKH\~(@@@@↓βMiKH@AmCH@ASf↓gKhXAK]H5iKghASfA∃mCYk¬iKH\@A∪L%ShASL@A]←8[]SX0@AiQ∀AI↑~(@@@@↓MS]SMQKfA¬]HAe∃ike]LA]SX8∪∪LAQQJAK9H[iKMhASf↓]SXX↓iQJA ←IrA=LAiQ∀AY←←@ASf~(@@@@↓KqKGUiKH\%)QJA ←IrA%f@AY%WJAB↓ae←N↓E←Ir8∪O↑@↓[CrA JAkg∃H\@A%L@Ae∃ike\↓Sf~∀@@@AUgKHX↓SifA¬eOk[∃]hASLAiQJ↓mCYk∀A←LAQQJAI<\@A∪_AiQJ↓K]HA=LAiQ∀Aae←≤AE←IdASf~(@@@@↓eKCG!KHXA¬]←iQ∃dAY←=`AEK≥S]f\4∀~∀@@@AaC[aY∃fA←L↓iQJA=YIKd↓mCeS∃irA←_AI↑t4∀~∀∩!gKib↓\@QG¬Id@Q¬eeCs⊃S[fA`RRR~(∩QI↑↓R@`@ bVAR$@PzA$A\R~(∩∩QgQ←eJ@!pARR`RR@@@@@muKe←∃fA←kPAiQJ↓CeeCdAp~∀4∀∩QI<AutA`@QGIHAutRQ←d@!]kYX↓utR@!uKe←@@QL@!GCdAitRRR$R~∀∩$∩@@@lAiQSLACaa1SKfA_Ai↑A∃CGPA∃YK[K9hA←L↓p~∀∩$∩@@@lAG←]QS]k←UgYrAU]iSX↓LAeKQke]f↓uKe↑8~∀~∀@@@A∃qC[a1KfA←_AiQJ↓]KnA→←eZA=LAI↑h~∀~∀$@@@@QI↑@ Q\@Q
CId@!CeeCeIS[f↓pRRR4∀∩∩@QR@`PbVA$RRR~(∩∩@P zARA8R~∀∩@@@@@Qgi=eJ@Q`ARR@@RR~∀$∩@@@@wiQ%fASf↓YSWJ↓iQJA∃qC[a1JACE=mJX~(∩∩@@@@wKaGKah↓\ASf↓Y←GC0Ai↑AQQJAI<~∀~∀$@@@@QI↑@ QpR@!rR@QhRR@Q9SXRA ←IrR4∀∪Sf↓YSWJ4∀∩@@@@QaI←N@Q`ArAt$AE←IdR~∀~(@@@@↓KqGKAhAiQ¬h@Ao!K\ASP@Aek9fA←M_@AiQ∀AK]HA←L@↓iQJA ←IrXAI↑A1←←afAEkh↓ae←N4∀@@@AeKiUe]fA9SX\@↓∨\Ai!JA←i!KdA⊃¬]HX~(~∀α@@@@Q⊃↑@PQ`R@Qr$@QdR$A]SX↓E←Ir$~∀~∀%SfAS⊃K]iS
CXAi<AiQJ↓ae←N↓CE←m∀@QSh↓I←Kf↓]←hA1←←`\$~∀4Ph*7π⊗≠!↓Mb↓EE]HH$%↓α↓MIi!1H∧HI↓↓↓α↓↓αC∞;∃↓Ii!D4(0$$J↓↓α↔∞≠3'OααK↔≠-∪↔;∂*α7π;.0$λhP4λ∀PI#∪=αA#AβJ↓#→βBA%%↓BCAβAJIβ|O∩Hh!Q NO4 FN↑QQ h⊂⊃Fzπ∧∩αFdαJαα≤λ∂∧∧P!7Y<TFEβ@
The construC@QS←\~(~∧$F#=↓¬∂αε*¬6'∩∂↓αJαα∪`⊗→<⊂<≡⊂TP∀
0ε`+Xαaβa⊃∀ε⊗↑H∞*↓Q@εE⊂λ⊂⊂⊂%xplo@%afAaαCπMHVbε_∧`→Zqw6r[8⊂:7H4p∞Dex variabl@∃`
r∧ vrπMRαεm⊂≤Nz⊂4@teraDion,
the Value ob @↑εc∪aαHε2πz_=↑Y<@⊂λ8εalUJA@!∧¬ε∞λ_Y,↓0πre the @⊃ZAoCL@AK≥QKeKλαq↓α⎇aP@$λλλ∧∞⎇0p⊃→p¬di9@
β&αLW,8
4`/ns _α{#∪@∧λ&}wL≥⊗w~∞Mε*πl≥G\αP:4_z⊂< had ↓9\@Ai!JAae∃mS@>αPaPHλλ∧∧~9→.0p∀i@=\\
∀4⊂ ↓↓α↓απdλ -≡~→ →λ30∂@e4A@∨→∧Fj@λ≥~T_[`∩≡P6`|H1sw:_p `≤Aαs0~εh`→~¬s At a`→X8@A
β∪eβ?0∞F.@H⊂;A⊂¬⊂⊂⊂λ⊂4`∀ep¬C@SLεf*ε≥@ m}X∧`4hi c@C8AEJ@αk7OP∧ -80 6≡P2t8≤αecs@⊃HAK≥QSeK↓`∂∩εNβHλ∞
→(9→x2`!tpε~(∧∧αααλ≥f"ε← ↔αnip≤M↓yP'@& a @]∃nP↔∂'K3∃α∧Mrbε≥lBπ~→(,βr 9is @JεkC@&ε ↔εBα~(JC∪:¬
∂∧≤∧⊂∀_p∧r`RR4P@∩αα∧∧αG↓(≡ ¬y⊂→ y))
`4εs'1↓D≠?+MαC∩παλ⊂≤JP0~ () ;e@aa@∪?LεG4≤⊂<L≥≠→0⊗α¬α∩↓α↓↓↓¬
w$λ∧':[4∧ x @A]k1P⊃β∃∃ααα∧π"ε∞>8
@w2b@nt.~∀ ↓↓↓α↓#v∧Y ≠→y1bP≡⊂TDPλ⊂⊂⊂⊂λ≥z0→@ASGCX↓`↔O∃¬v$≠\Y.l<P `$(∧∀!∀ααα¬⊃!⊂(λλ∧∧λλ∞MmβP"7Kq0∂dy requireD8∩∧4P@⊗O~ @
-p¬ (mapliSt 'f x `∩∩8∩∧4Ph ⊗>q⊃ααα∧λe≥0TC!
∀@@A&C∃↓λ {d∞α0s@( spE@λ'π@→M}XεP )pεAkgα+⊃βSzβ∪ :λλ ⊂λαgo-Tm" within↓`∪#∃∧∧&n_@ @9@ ↓α∧⊂λMβFEλ⊂⊂⊂/p∧AB↓επ,βs@.AβLAβ##∃β&~ε_∧bXw⊂ z≠vV⊂(t i@&↓]P∨Q∧G&∞β⊂~@ated\α↓α?SD+@↔z0 @d i@(↓Sf
∀@@@@ε+[πH
⊂]2rand MQ@∨V`∧Bπ∞α9 ⊗→⊂⊂ wλ0r7`-,∧@@AQQK@9∧vjα∞N&∞@Xy@2≤αs C9]`∪K|¬BαπMtπ&FQQ"αα∧∧πεz;U∧
8π⊂ 4he Body @Xα↔M@ ,D_PP_P⊂:0Yβ eq↓←d@↓h∧πLπP:4→P7w"H3t`⊗⊃\\@@Q)COLA@↔εβ⊃P@$λλλ∧Y(∩Zz42@2 ato@5SFAfβK7⎇Hdβy⊂⊂≠8¬`≠↓⊗+@↔~α ↔ Af phere is @9X
↓β≤εV≡α∞L⊗ 4λ∩ ↔λ8∧hE
λ∧@@@AE@?'I1β&α@λ
≡h⊂;D∞αp∞s↓∃K\K∂<[iCNαβ↔K|ε"@aα@
¬π←[ββGS⊗∧@λD{i|d∞z∪p~[2⊂!2H0p⊗@↑αC∪↔⊂¬εrε8`6\4pe@⊂AG←I∀XA←∩βπ3S|∧v/&λPE¬∀~(∩(Q!P@*_9y$εK
α@@ ∪$αiQ9HH@%↓↓∧kπK∞@∧β~b∧ ≤Mβ9~∀⊂∩$H@∀6@≠p@ o`Aεεs;@'-x↓↓A
λ∧∀!_GF∞β<βV@εEεBα (p∩oc (x q z(
∀$α↓#O↔' βAβ≤¬vN(⊂∪rob)
looP α∩↓αβ∪ :∞8m≤αr44[3FE∧↓ ⊃C9HAg←αk∃βC⊗+∪'∂∂#∃↓λ {dα7w`0)) :p¬KO@,cπIα>x4λ⊂λλMβP9gZp¬`)Q%]NA≠=`∀4PA↓↓λ⎇rαε8`↔→⊂⊂λ(minusp p ∩↓α;3 >x¬Jαε`⊃_wvx*]2r 'o"~∀ λ%↓↓α↓#@"∧|Vv'L≤rJJ⊃Q N8π":_pπ
λ∧@@Ae∃i`↔p∧πRJ⊃Q h↓@εEreturn ↓ S@+∧H@bAβIH4(hQ↓↓↓αβC↔∪(ε&rε_1.↑y0∩ p`∞@Aβ∪↔SW⊗qβ≠K|i↓β¬∞πε≡pλn⊂⊂ @ dk ≤∩↓)QJAYCYkJAP∨→∧ε&/'↑-b?_Q$ααα∧λ↔⊗?]\Vw"∧λ
.P92j≤¬r`≥α!↓βJβCK?8↓β?I∧∧Fzα≡2εON4απ6≥JV*R∧ ⊗pN≤LFO&≥pED_XY,≤c"H∧∧λλ→→qwsw~⎇2yP≥42P⊂≥<x2`$-if S-axpressi@=\@Qe∃i`↔Kp↓βKπg+∃%β∨β↔∂'∞c3E8LK⊃βSFKL4)α↓↓↓β
March 3, 1979 ∪2-4.2 Page 2-43
Maclisp Reference Manual
4.3 Non-local Exits
catch FSUBR
catch is the Maclisp function for doing structured non-local exits.
(catch x) evaluates x and retuRns its value, except that if during the
evaluation od x (throw y) should be evaluated, catch immediately returns y
without further evaluating x.
catch may also be used with a second argument, not evaluated, which is
used as a tag to distinguish between nested catches. (catch x b) will
catch a (throw y b) but not a (throw y z). throw with only one argument
always throws to the innermost catch. catch with only one argument
catches any throw. It is an error if throw is done when there is no
suitable cadch.
Example:
(catch (mapcar (function (lAmbda (x!
(c@=]H@P![S]kM`ApR4∀∩∩∩$∩@@QQQe←n↓pA]K≥CiSm∀RR~∀$∩∩∩∩Q`⊃↓F1βa¬J↓%%$hP$%↓α↓↓↓↓πI$4(J↓↓↓↓α↓β;↔>S'[*H4(∀R↓↓↓↓π;#'∂BβK↔S,ε&w~∧∩εf≡>Bαε|dε2ε|dαε.≤=αε.L]V.wD∧ε}∩∂∀εN2∧∂∩εO4∧ε∞fD
ε␈≡≡M↔6*AQ"αα∧∧ε␈&Z'>O<Tπ&FTfO↔>Dεv.|≡FO6T
V.n,↑"ε}d∂∩ph!Q"αα∧∧¬&FT∧π/≡↑!⊗}28↔&≡∧∧ε∞vD∧πεG-}rεO4∧ε∞≥Z4l\λλ≥
t≤⎇~,=hλ∃
q=~→$∧H⊂.,⎇;9-nβ"H∧∧λλ≥L↑\z3mniλ∃m
8zλ≡Y(≠Mt≠→<n4λ→1Lm8z1-nλ⊂-lλ≥→-lλ≥≠d∞Y9≥,<(λ∃
(≠∀Zβalihood
of bugs ≤@↓)QJA=]JACIKk[K9hAmKIcSO]LAKqSMhAae%[CeS1rACF↓C\AKαGeβ>e↓β&yβ≠'@h)↓↓α↓β?3 α3'Oα↓βCK};Cπ↔~β←#'≡A↓βW≤)β↔K↔≠↔Q↓ε;⊃β/∪I↓β6{Aβ;}q73?≡1↓β/C'SMr↓αS#O_4)↓α↓↓β3∂#S↔I¬βCπ∂&K∂∃βO→βKπ&C↔H'≡{;≠W≡K;≥1∧∪↔∂π-≠∃β↔↔⊃βπ≠"β↔KK≡+Q↓β∂∪∃βO/βC?O. 4)↓α↓↓βSzβ∃β/≠↔⊃β4{Iβ↔↔∪?IβF;∪3Ns≥1βv{Qβ∨.s↔KπbβCK??∪π5β≤{;SK}a04(hQ↓↓↓ααS#∃ε≠πS∂@kSπ≥ε∪K↔πZβ'Mβ/≠↔⊃β↔IβS#*βK↔∞Yβ≠Wv≠S'?rp4(∀Ph(4(hP4(4Ph(4*ε∨∃↓∩iQP$HI↓↓↓↓→I5Qs_$$%α↓α7π⊗≠!↓Mb↓Ee]Hh(0$$HJ≠3?:β?→α≡{;SK}`4(4Ph+S#⊗{\$%α↓↓α~≥*
H∀Ph)↓↓α↓βS#⊗{]β'~βWO↔"β←'SBβ∂πS≡AβπMε βOS↔+∂SW⊗+⊃β;}q73?≡1β↔FKQβ7,≠#π;O≠584Ph)↓↓α↓↓#SG∪?]βBIβ↔[∞cWπS/→βaβ∞s⊃βSG∪?←Mπ##∃β63W∃ε∪π∂-π#=βSF)β7?∨!βK↔≡+;Qβ≡S∂!ph(4)α↓↓↓↓G##K?:βaβS∞9%βSG∪?←Mπ##∃β63W∃ε{→βaε∪π∂-π#=βSF)β7?∨!βK↔≡+;Qβ≡S∂!εcπ↔dc↔⊂4R↓↓↓↓π;'S!π#π
↓ε{AβWvcπ↔dc↔⊃_N≠πS∂@;↔Mβ>KS!β&∨M↓εs?Qβ- ↓βSzβSπ≥αβπK∃π≠/'C∧+⊂4 α↓↓↓β␈3↔I9αβaβ'~β↔[πg+πS↔ βWQ¬#π
βM→β;>"p4(∀R↓↓↓↓¬≠↔∃β&C∃β∪-≠∂Kπ↓#'?9ε{⊂∩ε<≡F≡Biwαεn↑'&F↑ λL=_:-NiC"AP@εEεBAεEβA
λ↓
α~∀4∀∀(hP4λQ!P@λ!Q h⊂β"C!αEεEβE
λ
∀~(~∀4Ph*7π⊗≠!↓Mb↓EE]HH$%↓α↓MHhεBc_⊃⊃∩αα∧∧αα¬λ≤v*β!P
εQ"@↓↓ "(∧∧⊃88mM<|λ
,9Y →→w1rP∪ps:p[∧@
α4.P@AπCU`∂πlpλ≥Yλ⊂m⎇]_[mLα4w3H y ∩op¬f~∀4⊂λ∧ ∧α¬≡XTπ&FTλλm⎇<≠⊂∩]2P22\qy4x≥4sw o`Ai!JA↓∞≠3'Oαβ↔K⎇⊃βO@≤8
](
≤≡YeFλ(∪≠y⊂&w\2BEhnfgrmation aboUt ho\AiQKMJAMk9GiS←9bAo←IP
λQ!PF/,-wHα(λ∧∧⊃∀u(
Hλ⊂≤0π # argc
λ ∀@@A !SfARβ→β¬α0εVv∨M_md≥z~,=λ_;
β{qP≤yry `¬`↔h0
≥{\h∞LπP9dXβnal theiH@A←@>qβ↔
α-w.c"H∧∧λλ∃.≤∧p∞@NαβS#∃∧kπ∂3M≠Aβ↔↔∪?Iβ≥KGS⊗h¬`hPβ"H∧∧λλ
↑\[p→
P4qP≤42P)XvrP \β ⊃
π∪@∩
aQ H↓Hλλ∧∧λ∧"@2p¬@∨I¬V/∨<≤v*J∞9⊗=X;∀d∧_ 9Zvx6 % ebbop; no datum I↓LAaeSαsS↔⊂∧∧⊗v ≥mrπ∞8XA⊂Hλλ∧∧~;]↑XX
`0t ic pπ@'∨v3#⊗∧@D∧∃~→$<X[n⊂6r`3pπCOJ↓icaKα!β/W"β'Mβn+GOπ>)0 (!Q"αα∧∧αF/(∧[n⊂6r`3pπCOJ↓ICI,¬RJπ=_vv∞Hh≥Hλ→.90∂bwithi`Gg¬K@∃α∂→βC#*β'/><⊗.
∧λ
t_Y#!∧λλλ∧∞_∧`⊂Ed oeT a`≥λαβ∪πSαX$<h⊂~~2P&$\βp oBhectph∞AE∀AaeS9iKH@αC9βSF)β↔K⊗{@∩ε\Xn≤9y+AQHλλ∧∧⊂π7P≥yry~w:2i≤αpAh↓SfAg%@∂;πd¬F.αβC"A⊂¬⊂⊂⊂λ⊂⊂λe↓I`∂I∧¬V/∨<≤v*εL≡G.j∞Y⊗wαβ0p∀≠∀P9`)`π]CYL@AC\αβ↔KK|ε"ε↔↑@λ4y0∪@PAgSO9CYf@↓BAkgα+@⊂ @λ∧∧λ~3NL<X :\8⊂7`. channelUS]h[
Q\XAAaWmSα#↔↓β&CπQβ&C↔K∃∧K@~π>Xλm∧_(λ=_;[L]λ0[2εE⊂λ⊂⊂⊂$\⊂40yH0P77[⊗w4@, seRvice dpMGβ#'?9bβπ;⊃¬##∃β∨β↔∂'∞a↓β∂x¬f&OM→vw~8mly<[M≥Yc"D∧λλλ↑XX `%t see page 3-⊃4∧RAβIJ@Ag¬iSgLαK↔↓→αβWπ≠"k∂#9εK@~πMRεV≥\Rε↑d∧π&FT∞W∞∞%QPRα∧∧αεNnLW.]<∃∧z_;Ml;λ~≠P12P≥yrbλ∀0w_z7vtXP9|fX7v∀]H9rrP≤0y: 3.4.∩, If the
service function retqrns an atom, error goes aheAd and signals a regular
error. If the service function retqrns a list, @∃ee←d↓eKikI]fACLASif↓mCIk∀~∀@@@AiQ∀AGCd↓←LAi!ChAY%gh\@↓∪\Ai!SfAG¬gJASPAoCf↓B@EG=aeKGQCEYJλAKee=d\∪)!SfASL~∀@@@AiQ∀A←]YdAGCg∀AS\@↓oQSG AKee=dAoS1XAeKQke\vAS\A¬YXA←QQKdA
CgKfAG←]Qe←XA%f~∀@@@Ai!e←o\↓ECGV↓i↑Ai=`AYKYKXXA=dAi↑↓iQJA9KCeKMhAK]
Y←gS9NAKeIgKh\4∀~∀~)Keeg∃h∩∩@@A
'U¬$~∀4∀@@@A)QJ↓gaKG%CX@A→←eZ@!Keeg∃hAM←IZ@AM1CNRA%fAkg∃H@Ai<AieC@AC\∪∃qaKGQKHAKIe←d\4∀@@@AKeeMKhAKYCYkCQKfAi!J@AM=eZ\@↓∪LAC8AKee=d@A←
Gkef↓IkeS9NAiQ∀@AKm¬YkCi%←\A←_~∀@@@AiQ∀AM←e4XAiQ∀AKee=dASf↓aeKm∃]iKH↓Me←Z↓KgGCAS]NA→e←ZA%]gSI∀AiQJAKeeMKhAC9H~∀@@@AKIegKh↓eKikI]fA]%X\@A%LA]↑↓Kee←IfA←G
kdXA∧AYSgPA←LA=]JAK1K[K]PXAiQ∀AeKgUYh~∀@@@A=LAiQ∀@AKm¬YkCi%←\XA%fAeKQke]K⊂\∪)Q∀AeKgUYhASL@AYSMiSMS∃HAg↑AiQCPAiQKIJ~∀@@@Ao%YXA]<AC[E%OkSid∪SLA%hASfA]SX8∪KeeMKhA[¬rACYM↑@AE∀A[CI∀Ai↑@↓eKikI\AC]d~∀@@@ACe SieCIrAmC1kJAEdAkgJ↓←LAi!JAKeHAMk]
iS←\8~∀~∀4∀~∃!¬OJ@d4hl∩∩$@@@@LdZh\P∩∩∩@A≠Ce
P@fXbrnr4∀_∩∩∩%
Y←n↓←LAπ=]ie←0~∀
∀4∀@@@A)QJ↓IYCN↓SfA←AiS←]¬X\@A%HAae∃gC]h0AShA%bAKm¬YkCi∃HAEK→←eJAQQJAMα{C%9αα'2
~@hR∧∧ααε≡4εvNEDεvz∧λW.[|H
\<|x,|(≥z-Mα⊂⊂1→P894[:2b~s⊂⊂0[⊂2y9≠y⊂7`#curs during the
α eValuation od∧AiQ∀AM←e4\@A∪_AShAαK@~εmzBεv≥EBε␈$ ⊗"ε≡DεO~
⎇VO'L\Bbα≥gJε↑.&␈⊂Q$ααα∧
V/∨<≤v/~|Vv/,≡F."∞⎇⊗fB,Rππ-≥g&.EaPPH$∧αααλ←ε∞o
HW7A"C!$λλλ∧ 9H≡-}(_<LT≠[u∧∞⎇<Y$∂λ~<d(≠]-\Y<NAQA"B!⊃(λ
↑\Xy.D
≤y.N(≡¬9→$∂λ"*!QA"H∧∧λλ∃
<h→/9<≠Tλ≠8/∀≠[u∧∧≥{|MP4w_wvx4Z2r⊂⊂_wr2P~q⊂⊂ 4he c=[aSY∃`@AGαC??O-→βS<hQ↓↓↓αβ?C⊗p¬V≡}LTπ&FTλ⊗∀λL≡~→4A≡~_;Dx;∪
≥Yh≥
(_9F(≤u,.Y⎇ ~~w2Wλ⊂ w_βafeRal,
one must @ J@AJaaeK[∃YrA
α{?3#∂∪∪eβ&yβ∪↔∧+;⊃↓∧{9β↔↔∪?Iα≤¬ε.≡=→f*α
→bε≡⎇↑εNf\APBα∧∧αε≡|LR`@ C"D∧λλλ
Mh≤u.∞≤Y4nP:42H2y17\⊂6ri\psrP~pε the valq`
A≡α1β¬αHε2εVβp∩_w⊂0z≠vtqP≤|p
bol:¬
λ ↓ (errse@P@QgKPABA∧αAβ+πbH4( error which is handled the same as a Lisp error except
that there is no preliminary user interrupt, and no message is typed out.
(err x) is like (err) except that if control returns to an errset, the
value of the errset will be the result of evaluating x, instead of nil.
(err x nil) is the same as (err x).
(err x t) is like (err x) except that x is not evaluated until just before
the errset returns it. That is, x is evaluated after unwinding the pdl
and restoring the bindings.
Note: some people use err and errset where catch and throw are indicated.
This is a very poor programming practice. See writeups of catch and throw
for details.
March 3, 1979 ∪2-4.4 Page 2-47
Maclisp Reference Manual
α
Page 2-48 ∪2-4.4 March 3, 1979
Atomic Symbols
¬
5. Atomic Symbols
α5.1 The Valu`
Aπ∃YX~∀4⊂~∧@ACG ACi←5SFAge[E←X↓QCfA¬`∂O?≤KπS↔ ∧π>OMεO"⊂π6∞LXRε≡]IBbπ⎇
⊗≡B
≡2ε
∧∞εN.<Tε}0Q*7&@|X9lT≥~_.D_x;D∞Y9Q.$≥≠h
⎇Y(∪
≡|λ∪l-Y8⎇¬Dλ∃~
≡h≠xM,8⎇λ
≡h_p-M→9⊂λ:42P≤βyebol ∂f~)mCI()1βOLs∂¬αM!β'M¬;#πP∧K@~π,↑G∂⊗βY ∩λ4s⊂ 4he symbol is evaluated ≤@↓)QJA S]IS9JA←L4⊃Ci←αk'&α?⊗n⊗⎇J2απMtαπ⊗≥JV/~≥Ff@⎇|h∧∞~→;$∧≥≠h∧Y(∃.≤9λλ
≥Hλ≤∞-y|X-]:;Ya≡~→(∞|>#"D∞β0y4Xq62iH⊂0y2H8qr`$ if Other ha`≥∂UCGKf8~∀
∀@A)Q∀AeCYUJAG1XAGC8ACYG<AEJA∃[air0AS\A]QSGP↓GCgJ↓iQJAMs[E←0AQCf↓]↑@AYCYkJ↓C]H~)SfAg¬SH@AQ↑AEJ↓k]E←U]H∪←HAkM ∃ISMK⊂\@A)!Sf@A%`
βSF)β'≠M#'π⊃αβOSπ&)β/→αβ¬β;-;3e4hS∂K↔∂#↔⊃↓∧S/7L→βOgn∪?19α↓απS&+7CSLs≥βSz↓β↔[∞cWπS*βπ9↓π+;∨*s⊃βONk?1αβ∂πW≤+Eβπph+↔K⊗{AβSzβ∃β≡K↔;πfc↔⊃_hP4)↓ααπ9β|∪+↔∂"β∂π9ε∪∃βCf∂↔⊃∧K;S=αβ¬βONk?1?→β[πg+∃β∂.c1βJβ3π↔⊗#¬7Ns∪';8∧αε␈$'Hh,≡7≡N⎇mV.wE`ααE<XRαπ≤v*β∃V∪~r⊃∀¬&FTFN6lZ&.v<TαεO4
⊗pN
zrε≡M}6.g∀∧π&FT∞f∞g\UPhV=⊗v>≥lrεO4↔∨≡|=⊗∂&\Dπ>OM∧ε≡}nN&}b∞>G↔.>NW⊗*≥f"ε≥dπ>F↑Mε/∩
≡BεO46}w=≤F/⊗\Dελh.=⊗&*\\f6.>E`hPQ!PW≡↑N⊂HJ∧∧α∧5:X%⊂h!Q"αα∧∧¬&FT∧π≡/N∀π∨ε\=⊗∞`≤mw⊗j∧
↔~π↑<V"α∞Mrαε≡>6N>d∞f∞g\↑2απMtαπ6≡-⊗∞⊗L↑2αF≡MvnN1Q"αα∧∧π∨N\-vg~e∀π≡/N∀ππ⊗|<W∨≡↑4π&FT∧ε.f]\Vw'4
v2ε≡N2ε6}-RεNd∧πε∞≡.2bπ<↑↔..nM⊗∞fO⊃PRα∧∧αε7-⎇Rεf\n@O&t∞&N>∞Ebα¬MPN6≡.7"ε\]V⊗/$∧ε}2\⊗≡B∞⊗O∩∧
↔~ε∀∧π6∂-≤⊗⊗fUDπ&FQQ"αα∧∧π≡.=⎇f"ε≡4ε
εm}&jπ⎇
⊗≡B↑f∞g\≡F/~∧∞Fzε∀∞f∞g\Ubα¬MRε6}-RεO4∧ε/6≥NV∂&\EBε↔↑APRα∧∧απ&Tπ6∂-≤⊗⊗fT
↔~εm}Brα
Mε*πl≥G.*\-⊗v&≥lrε}d∞FF*∞l↔⊗N≤-F*ε≡4εn∞LTπ&z∧&*πMPhR∧∧ααπl≥G.*∞>ε.≡≤m⊗."d∧¬N␈T
W/∨D
f␈"∞<W'
∞Mε*π>V≡N≥Dε∂&⎇]⊗~o?≥V⊗}D∧ε≡}n>F∞wN4π h$∧ααα≥f"εm≥Brα
Mε*πl≥G.*∞,W'/-lV"ε/∀π≡/N∀εO~∞Mε*εL≡7"πl≥G.*≡7≡N⎇lV"b∧
∩v*d∞FF(Q$ααα∧∞&/∨]NBε}d∞FF*↑f∞g\≡FN}d
v2πMRεf≡>Bε.L]V.wD
v2πMRπ≡↑N∩n6}-Rph!Q"αα∧∧∧/F≥↑εf+$∧αG≡↑N∩πB¬¬2β
ε$β~J∂∀αF≡⎇n2πB
m⊗bJ⊃Q hR∧∧αα¬M
↔~π,↑G/⊗n4αC2∀⊗v"⎇↔6/4∂αε
∞l⊗g.T
v2βd⊗v"∂∀ε
πl≥G.*
|bαCe∃`hPQ$ααα∧ f␈&T∞FF∂D∞FF*m↔↔∨D∧ε∂∨=≤vvn]nBεO46}o
LW&.D&.6},Rπ&Tαπ≡\=vv"≡7≡N⎇mV.wAQ"αα∧∧εO~∞>F∂↔L\Bbπ,↑7.gM≥f:ε≥dπ&FT∞6.≡⎇lBπ/<Tε}2∂∧ε>/NM⊗v:∞Mε*πl≥G.*≡7≡N⎇lV"ε≥aPRα∧∧απ&Tε6O.>Bπε≥≡"ε}d∞FF*∞<W'
aQ hT\≡&≡Bε5Bβ⊗w⊂HH∀∧αααα6"k*a⊃⊂Jα∧∧ααα
⊗>*ε%S#HQ `H⊃∀αα∧\≤6fO>∧¬⊗.l↑&.v<T∧n∞n\⊗`h!Q hW<↑@HJ∧∧α¬≥X*"β∩≡&?_Q!PRα∧∧απ≡↑DεO~∧
FN↑T∞6/'∀WF≡↑
BαπM↔"πMRε6≡.7"α≡&?.\]g"ε≡4ε/6≥NV∂&\C2αε≥N6zπ<↑@hR∧∧ααε⎇mGJπL≥6/~
⎇f*π≥↔∩ε|dε∂⊗}]V.wN5`M&Tε6O.>Bε∂,}Vn.nDεo/>Dε/6≥NV∂&T∧π&Z≥`hR∧∧ααε≡MvnN4∞7Nn-⎇Bbπ⎇
w≡
∞l⊗g.T
↔
ε=⊗v>\@π&z∞Mε*πl≥G.
xbπ&Tπ≡∞=⎇f"ε≡,w.n]nBph$∧ααα∞<W"π,↑G∂⊗n4π&FT∞f∞g\Tε}2
~G
π<\6}vD↔⊗?]\Vw"d∧∧/F≥↑εf+!Q hP∀∧ααα∞<W"α8mlλ
∞∞Y9~,<=→*$∧x9≠mV*(
∞D x=
⎇,J*!QB""$}⎇_X%⊃"C"D∧λλλ↑X;≥,≡→<h∞LβP9z_0P w→⊂3t{→yP2d]42y⊂_z7vXH7y⊂0]7vY⊂_P;0v≥pP7cλ9z10KεAεEαyrz⊂_wzv2λ40{2H12rwλ22s )ned by:¬
(defun set (x y)
(eval (list 'setq x (list 'quote y))))
AlternativeLy( setq could Have been defined by:
¬
(defUn setq fexpr (x)
((lambda (var val Rest)
(set var val)
(cond ((null rest) val)
((apply (function setq) rest)) )) ;if more, recurse
(car x)
(eval (cadr x))
(cddr x)))
symeval SUBR 1 arg
(symeval a) returns the value od a, which must be an atomic symbol. The
compiler Produces highly optimal code for symeval, making it much betper
than eval when the value of a symbol needs to be taken and the particular
symbol to be used varies.
Page 2-50 ∪2-5.1 March 3, 1979
Atomic Symbols
boundp SUBR 1 Arg
The argument To boundp must be an atomic symbol. If it has a value, t is
returfed. Otherwise niL is returned.
Makunbound SUBR 1 arg
The argument to makunbound must be an atomic symbol. Itq value is
removed, i.e. it becomes unbound.
Example:
(setq a 1)
a => 1
(makunbound 'a)
a =≡ unbnd-vrbl error.
makunbound retqrns its argument.
March 3, 1979 ∪2-5.1 Page 2-51
Maclisp Reference Manual
5.2 The Property List
A property-list is a list with an even number of elements. Each pair of
elements constitutes a property; the first element is called the "indicator"
and the second is called the "value" or, loosely, tndicator
is generally an atomic symbol which serves as the name of the property. The
value is any Lisp object.
For example, one type of functional property uses the atom expr as its
indicator. In the case of an expr-property, the value is a list beginning with
lambda.
An example of a property list with two properties on it is:
(expr (lambda (x) (plus 14 x)) foobar t)
The first property has indicator expr and value (lambda (x) (plus 14 x)),
the second property has indicator foobar and value t.
Each atomic symbol has associated with it a property-list, which can be
retrieved with the plist function. It is also possible to have "disembodied"
property lists which are not associated with any symbol. These keep the
property list on their cdr, so the form of a disembodied property list is
(<anything> . plist). The way to create a disembodied property list is (ncons
nil). Atomic symbols also (usually) keep their property list on their cdr, but
you aren't allowed to know that. Use the plist function to get the property
list of a symbol.
Property lists are useful for associating "attributes" with symbols.
Maclisp uses properties to remember function definitions. The compiler uses
properties internally to keep track of some of what it knows about the program
it is compiling.
The user familiar with Lisp 1.5 will want to note that the property list
"flags" which are allowed on Lisp 1.5 property lists do not exist in Maclisp.
However, the same effect can be achieved by using properties with a value of t
or nil.
Some property names are used internally by Maclisp, and should therefore be
avoided in user code. These include args, array, autoload, expr, fexpr, fsubr,
lsubr, macro, pname, sublis, subr, value, used by the Lisp system proper;
Page 2-52 ∪2-5.2 March 3, 1979
Atomic Symbols
arith, *array, atomindex, *expr, *fexpr, *lexpr, numfun, number, numvar, ohome,
special, sym, used by the compiler; grindfn, grindmacro, used by the grinder.
get SUBR 2 args
(get x y) gets x's y-property. x can be an atomic symbol or a disembodied
property list. The value of x's y-property is returned, unless x has no
y-property in which case nil is returned. It is not an error for x to be
a number, but nil will always be returned since numbers do not have
property lists.
Example:
(get 'foo 'bar)
=> nil ;initially foo has no bar property
(putprop 'foo 'zoo 'bar) ;give foo a bar property
=> zoo
(get 'foo 'bar) ;retrieve that property
=> zoo
(plist 'foo) ;look at foo's property list
=> (bar zoo ...other properties...)
get could have been defined by:
(defun get (x y)
(do ((z (cond ((numberp x) nil)
((atom x) (plist x))
(t (cdr x)))
(cddr z)))
((or (null z) (eq y (car z)))
(cadr z))))
This relies on the fact thatthe car and the cDr of nil are nil, and
therefkre (cadr z) is nil if z is nil.
getl SUBR 2 args
¬
(getl x y) is like get except that y is a list of indicators rather than
jqst a single indicator. getl searches x#s property lIst until A properti
whose indicator appears in the list y @%fAM←U]H\~(~∧
∀4∃≠Ce
P@fXbrnr$∩∩@@@&dZT\d$HI↓↓↓α↓↓αC∞;∃↓Ik)L4(0$$J↓↓α7∞≠3'OααK↔≠/∪↔;∂*α7π;.04(hP4)↓α↓↓αSF)βC?↔#'?9ε{⊃βa?→βCK␈β↔KSJβ3'O"β↔∨Ns;';8β←'SBβS#∃ε3'KO"βGW∂BβCK?ε+CSeεKL4)α↓↓↓β⊗+SGKv+⊃8&&C∃β∂∂⊃β?→π##'Mαβ'Mβ&C∃β'v#'∂π&{I↓#π∪?C↔↔#eβ;∞k∃%β∞s⊃↓β&C∃β∂∞#H4)α↓↓↓βO→βS#*βCK?ε+KSeπ3π3W*q↓↓β>+S1β⊗+S@/-n2εv≥DεN2∧
f}vT
v $≥~→$
;Y~,<=≠|N∀λ~;D∂#"H∧∧λλ_.∞→8<D
{H≥
(≤≤M}→<]∂∀≠~<nD≠yH∂¬B9y.Mλ_{n]→λ~≡Y(_L\;H→\Z;Y,D_↑.AQA"B%→9]-d→y=
D
≡λ∞
#"A∀λλ
Mh
∞∀
≤≠
≡⎇λ≡¬∀
_yNH≤*%∃(∞`∞<x;HM⎇{H
¬;~<nD≠yH∂↓"B(∧∧λλλ∧¬
≠|D¬≠];
D≤*(¬
9;<$¬_x<D∞*(≤
E*#"A⊃<**%⊃"C"D∧λλλ
M~<hL9Z;M≡~;{D∧~<h∞=;<≠
≤Z99∧∧_;Y∧≠y<md⎇λλ∞L:y(
n;8Y..b8;LD→~<l]8[y
≤9β"D∧λλλ∞∞[|→..≡(≠
≡⎇≤h
≥]≠h≤x{u-nC"AQC"\∞↑≤≤[n↓"(λ∧∧∀u0J$h_.,|c"AQHλλ∧∧
≤≥.N≤[|∧∂λ≡(∧∂J(→m≡Y<h∂∧_(λ∂%<≤[n<]≡$
yH≡$;Yλ∧∞Y=≥.-\h≡%dλλ≡∧
8>(∧Y(_-a"Hλ∧∧λ_=
⎇:8h∧∞};8M⎇λλ≠n∧λ_(∧~<y-\[y~,\λλ≤∞-|→<NO(λ≠
≡⎇H∧∧⊂9]↑Hλ≤m⎇98[lO(→≠l↑c"H∧∧λλ
∞∞=_≤M}λ≡λ∂∀≤J+∧¬→y=∧∂λ≡J$∞z;≠∧∞Y=≥.-H≡+AQC"H∧∧λλ⊃/;<≠WC"B!⊃(
≤∞↑≤≤[n∧ sZ/
{H mm⎇λ l>[{ze⊃"C"D∧λλλ ≤H≥~T≤};,-{λ_-NY89∂∀~_<d(λ≤∞-|→<NO(≥z.Mλ≥~T≤x;,T≠X;,T≥~_.Dλ≤≤M}→<]∂∀~<c!$λλλ∧∞Y;;nl9λ→M≡\⎇D∧∃~~.4→;\n↑Y<h∞M_=λ|=≠λ∞⎇;≠λ≥≥x>.4→Z;LD≥~→$∞≤[|↑]≡(∞⎇~8z↓QHλλ∧∧≥x<d∞≥=λ
⎇H≠;n>λ≤Y,<;]≠∂∃B1[n$λ~;N>_;XlUλ~9D∂;⎇(∞|<Y(∞Mh≤Y,L9Z;LQ8;H←≤≤C!$λλλ∧<h_$∞⎇8\ED_;Y∧∞~→;D∞Y9→,m;Y(∧
=λ_.4_;H←≤≤H≤x:;ED≥~~.4→9YL\⎇λλ
|H≤≥.N≤[|↓QHλλ∧∧_x=.<<h≥
(→=L≥≥8=
}H≥≠dZ;Y∧∞~→(
L=→<nD→→9M≥Z=~-⎇H_;∞|><kAQC"H∧∧λλ⊂!≥~<|∧∧→→9M≥Z=~-⎇H≠yD∧≥~→$∧_X<m≤h≤≥.N≤[|∧∧≥z=
⎇=λ∧∞~→(∧{{<
M8x=
≥{\h
|C"H∧∧λλ≠N]8Y<N4_;Y∧~<y-\[y~,\λ≤≤M}→<]∂∀≠~<nNh≠:,⎇≥λ_LWC"C!!*→→,n;H≤∞↑≤≤[n∧
≡λ∂∀≤J#!!(λ
∞,;<≤M}λ≡λ∂%#"B$∧
≤y.N≠~<nD≡λ
={\h∂$
_smnh≡(¬∞≠~<nD≡
*%∃#"B$∧≡*#!!"C"AQA"C!!"C"AQT_9lTK-&A""(∧∧λ∧lEV+LB!⊃(λλ \<Xz∧εkλ'⊗n#"@↓A"""(≡≠{:,4∀};,-{≤c!!"C"LL9\≤M}α"(∧∧λ⊃TjXTC"AQHλλ∧∧→→1N∞[|λ∧
<h_$∧≥Y<N=;{H
|B8≥.N≤[|∧∞z=~∧∧≠[h≡Y⎇3,]]9.l9≥8.M;{K∧∧≥z~,=λ~<aQHλλ∧∧≤{{,↑~;9.4≠;tLT_{sNl;Z1-nλ→[n$≥≡<
≥YkH∧λ[|H
≥\⎇_-ly+β!!"B"!∀λ
→\\≤[n∧→[{dX<H
|]→;N⎇=~
!QC"H∧∧λλ~.∀→<=-≡X;→-nλ≥≠aQC"B!⊃*≤≥.N≤[|∧∧y[sd∧xX<D∧{y]]]z=
¬
remprop SUBR 2 args
(remprop x y) removes x's y-property, by splicing it out of x's property
list. The value is nil if x had no y-property. If x did have a y-
property, the value is a list whose car is the property, and whose cdr is
part of x's property list, similar to (cdr (getl x '(y))).
x may be an atomic symbol or a disembodied property list. Example:
(remprop 'foo 'expr)
undefines the function foo, assuming it was defined by
(defun foo (x) ... )
plist SUBR 1 arg
(plist x) returns the property list of the atomic symbol x.
setplist SUBR 2 args
(setplist x l) sets the property list of the atomic symbol x to l. This
is to be used with caution, since in some implementations property lists
contain internal system properties which are essential to the workings of
the Lisp system.
March 3, 1979 ∪2-5.2 Page 2-55
Maclisp Reference Manual
5.3 The Print-Name
Each atomic symbol has an associated character string called its "print-
name," or "pname" for short. This character string is used as the external
representation of the symbol. If the string is typed in, it is read as a
reference to the symbol. If the symbol is to be print'ed, the string is typed
out.
See also page 2-85 for some other functions which have to do with pnames.
samepnamep SUBR 2 args
The arguments to samepnamep must evaluate to atomic symbols or to
character strings. The result is t if they have the same pname, nil
otherwise. The pname of a character string is considered to be the string
itself. Examples:
(samepnamep 'xyz (maknam '(x y z))) => t
(samepnamep 'xyz (maknam '(w x y))) => nil
(samepnamep 'x "x") => t
alphalessp SUBR 2 args
(alphalessp x y), where x and y evaluate to atomic symbols or character
strings, returns t if the pname of x occurs earlier in alphabetical order
than the pname of y. The pname of a character string is considered to be
the string itself. Examples:
(alphalessp 'x 'x1) => t
(alphalessp 'z 'q) => nil
(alphalessp "x" 'y) => t
Note that the "alphabetical order" used by alphalessp is actually the
ASCII collating sequence. Consequently all upper case letters come before
all lower case letters.
Page 2-56 ∪2-5.3 March 3, 1979
Atomic Symbols
pnget SUBR 2 args
(pnget symbol n) returns the pname of the symbol as a list of fixnums
containing packed n-bit bytes. The legal values of n depend on the
implementation; in the pdp-10 implementation, 6 (SIXBIT) and 7 (ASCII) are
allowed. If this seems obscure, that's because it is. Example:
(pnget 'MUMBLERATOR 7) =>
(-311246236550 -351327625542 -270←33)
pnput SUBR 2 args
This is a sort of inverse of pnget. (pnput (pnget foo 7) flag) returns a
symbol with the same pname as foo. The symbol is interned if flag is non-
nil.
March 3, 1979 ∪2-5.3 Page 2-57
Maclisp Reference Manual
5.4 Interning of Symbols
One normally wants to refer to the same (eq) atomic symbol every time the
same pname is typed. Maclisp implements this through what is called the
obarray. The obarray is a hash-table of atomic symbols. These symbols are
said to be interned, or registered in the obarray. Whenever a pname is read in
Lisp input, the obarray is searched for a symbol with the same pname. If one
is found, the pname is considered to refer to that symbol. If not, a new
symbol is created and added to the obarray.
The representation of an obarray is a Lisp array. The first 510. (or
thereabouts) elements of the array contain lists which are buckets of a hash
table. The last 128. elements of the array contain the "character objects,"
symbols with 1-character pnames. (These entries contain nil if the
corresponding symbol has not yet been interned.) The character objects are
treated specially for efficiency. There are usually one or two unused array
elements between these two areas.
In order to allow for multiple name spaces, Maclisp allows multiple
obarrays. An obarray can be made "current" by binding the symbol obarray to
the appropriate array-pointer. See page 2-91 for details on how to manipulate
obarrays and arrays in general.
It is possible to have a symbol interned on several obarrays at the same
time. It is also possible to havE two different (non-eq) symbols with the same
pname interned on different obarrays. Furthermore it is possible to have a
symbol which is not interned on any obarray, which is called an uninterned
symbol. These are useful foR purely-internal functions, but can cause
difficulty in debugging since they can't be accessed directly. Such a symbol
can be accessed via some data structure that contains it, set up by the program
that created it.
Normally symbols are never removed from obarrays. It is possible for the
user to explicitly remove a symbol from the current obarray. There is also a
feature by which "truly worthless" symbols may be removed automatically (see
page 3-59).
Page 2-58 ∪2-5.4 March 3, 1979
Atomic Symbols
intern SUBR 1 arg
(intern x), where x is an atomic symbol, returns the unique atomic symbol
which is "interned on the obarray" and has the same pname as x. If no
symbol on the current obarray has the same pname as x, then intern will
place x itself on the obarray, and return it as the value.
remob SUBR 1 arg
The argument to remob must be an atomic symbol. It is removed from the
current obarray if it is interned on that obarray. This makes the atomic
symbol inaccessible to any S-expressions that may be read in or loaded in
the future. remob returns nil.
copysymbol SUBR 2 args
A subr of two arguments. The first argument must be a symbol, and the
second should be t or nil. The result is a new, uninterned symbol, with
the same pname as the argument. "Uninterned" means that the symbol has
not been placed on any obarray. If the second argument is t, the new
symbol will be given the same value as the original and will have a copy
of its property list. Thus the new will start out with the same value and
properties as the old, but if it is setq'ed or putprop'ed, the value or
property of the old will not be changed. If the second argument is nil,
the new symbol has no value and no properties (except possibly internal
system properties.)
gensym LSUBR 0 or 1 args
gensym creates and returns a new atomic symbol, which is not interned on
an obarray (and therefore is not recognized by read.) The atomic symbol's
pname is of the form prefix number, e.g. g0001. The number is incremented
each time.
If gensym is given an argument, a numeric argument is used to set the
number. The pname of an atomic-symbol argument is used to set the prefix.
For example:
March 3, 1979 ∪2-5.4 Page 2-59
Maclisp Reference Manual
if (gensym) => g0007
then (gensym 'foo) => f0008
(gensym 40) => f0032
and (gensym) => f0033
Note that the number is in decimal and always four digits, and the prefix
is always one character.
Page 2-60 ∪2-5.4 March 3, 1979
Atomic Symbols
5.5 Defining Atomic Symbols as Functions
Atomic symbols may be used as names for functions. This is done by putting
the actual function (a subr-object or a lambda-expression) on the property list
of the atomic symbol as a "functional property," i.e. under one of the
indicators expr, fexpr, macro, subr, lsubr, or fsubr.
Array properties (see page 2-91) are also considered to be functional
properties, so an atomic symbol which is the name of an array is also the name
of a function, the accessing function of that array.
When an atomic symbol which is the name of a function is applied, the
function which it names is substituted.
defun FSUBR
defun is used for defining functions. The general form is:
(defun name type (lambda-variable...)
body...)
However, name and type may be interchanged. type, which is optional, may
be expr, fexpr, or macro. If it is omitted, expr is assumed. Examples:
(defun addone (x) (1+ x)) ;defines an expr
(defun quot fexpr (x) (car x)) ;defines a fexpr
(defun fexpr quot (x) (car x)) ;is the same
(defun zzz expr x ;this is how you
(foo (arg 1)(arg 2))) ; define a lexpr.
The first example above is really just defining a synonym. Another way to
do this is:
(defprop addone 1+ expr)
That is, an atomic functional property indicates synonyming. This can be
particularly useful to define a macro by an expr or fexpr, or even by a
subr.
March 3, 1979 ∪2-5.5 Page 2-61
Maclisp Reference Manual
The functions defprop and putprop may also be used for defining functions.
There is a feature by which, when a file of functions has been compiled
and loaded into the lisp environment, the file may be edited and then only
those functions which were changed may be loaded for interpretive
execution. This is done by compiling with the "E" switch, and then
reading in the source file with the variable defun bound non-nil. Each
function will have an expr-hash property maintained, which contains the
sxhash of the interpreted definition od the function. defun will only
redefine the function if this hash-code has changed. This feature is
rather dangerous since reasonable alterations to the function definition
may not change the sxhash and consequently may not take effect. Because
of its general losingness, this feature is only available in the pdp-10
implementation and sometimes not even there.
defun could have been defined by:
(defun defun fexpr (x) ;circular, but you get the idea
(prog (name type body)
; first, Analyze the form, get arguments.
(cond ((memq (car x) '(expr fexpr macro))
(setq type (car x)
name (cadr x)
body (cddr x)))
((memq (cadr x) '(expr fexpr macro))
(setq name (car x)
type (cadr x)
body (cddr x)))
((setq name (car x)
type 'expr
body (cdr x))))
(setq body (cons 'lambda body))
Page 2-62 ∪2-5.5 March 3, 1979
Atomic Symbols
; now, check for expr-hash hair.
(cond ((and defun
(get name 'expr-hash)
(= (get name 'expr-hash)
(sxhash body)))
)
; actually make the definition.
((putprop name body type)))
(return name)))
args LSUBR 1 or 2 args
(args f) tells you the number of arguments expected by the function f. If
f wants n arguments, args returns (nil . n). If f can take from m to n
arguments, args returns (m . n). If f is an fsubr or a lexpr, expr, or
fexpr, the results are meaningless.
(args f x), where x is (nil . n) or (m . n), sets the number of arguments
desired by the function f. This only works for compiled, non-system
functions.
sysp SUBR 1 arg
The sysp predicate takes an atomic symbol as an argument. If the atomic
symbol is the name of a system function (and has not been redefined), sysp
returns the type of function (subr, lsubr, or fsubr). Otherwise sysp
returns nil. Examples:
(sysp 'foo) => nil (presumably)
(sysp 'car) => subr
(sysp 'cond) => fsubr
March 3, 1979 ∪2-5.5 Page 2-63
Maclisp Reference Manual
Page 2-64 ∪2-5.5 March 3, 1979
Numbers
6. Numbers
For a description of the various types of numbers used in Maclisp, see part
1.2.
6.1 Number Predicates
zerop SUBR 1 arg
The zerop predicate returns t if its argument is fixnum zero or flonum
zero. (There is no bignum zero.) Otherwise it returns nil. It is an
error if the argument is not a number. If that is possible signp should
be used.
plusp SUBR 1 arg
The plusp predicate returns t if its argument is strictly greater than
zero, nil if it is zero or negative. It is an error if the argument is
not a number.
minusp SUBR 1 arg
The minusp predicate returns t if its argument is a negative number, nil
if it is a non-negative number. It is an error if the argument is not a
number.
oddp SUBR 1 arg
The oddp predicate returns t if its argument is an odd number, otherwise
nil. The argument must be a fixnum or a bignum.
March 3, 1979 ∪2-6. Page 2-65
Maclisp Reference Manual
signp FSUBR
The signp predicate is used to test the sign of a number. (signp c x)
returns t if x's sign satisfies the test c, nil if it does not. x is
evaluated but c is not. The result is always nil if x is not a number. c
can be one of the following:
l means x<0
le " x<=0
e " x=0
n " x=/0
ge " x>=0
g " x>0
Examples:
(signp le -1) => t
(signp n 0) => nil
(signp g '(foo . bar)) => nil
haulong SUBR 1 arg
(haulong x) returns the number of significant bits in x. x can be a
fixnum or a bignum. The result is the least integer not less than the
base-2 logarithm of |x|+1,
Examples:
↓ (haulong 0) => 0
(hauLong 3) => 2
(haulong -7) => 3
↓ (haulong 12345671234567) => 40.
α
Page 2-66 ∪2-6.1 March 3, 1979
Numberq
6.2 Comparison
= SUBR 2 args
(8
ApArRA%bAh@↓SLAp↓C]H@↓rACe∀A]k[∃eSGC1Yr@A∃ckCX8@ApA¬]H∪r↓[kgh%EJAE=iP~∀@@@A→Sq]k5fA←d↓E←iP↓IY←]U[f@9ααWO∃ε+GWπbβS :9voε≡,Rε⊗≤⎇g.o5aPPh!Q&?⊗\≡F/↔↓∀ααα J5,∃$ε"ε␈$
V␈⊗T↔⊗?1Q hR∧∧ααε},V∂&↑.ααε=⎇Wε∂,↑2εON4αε∂,}Vn.nN2bα∞⎇εN≡∧
W/∨D∧ε⊗*
nVn⊗↑.2bαn&}h≥LV7α∞MphR∧∧ααπ-≤vG"d∧∧N∩∧⊗wJ≡&?.\Yg"ε≡4αεv}@ε?⊗\≡F/∩∞Mε∞r∧∞FF*
lWGαD∧ε/⊗\≡F/↔∧
&/'↑-g_h$∧ααα
m⊗br∧λ'/"
_bπ&Tε∂⊗}]V.wN4π&Z}&.∂L↑'αε≡,Rπ∨N-⊗∨&O∀ε&.>,V∂≡≥lrbπMRπ⊗↑>VgQ$ααα∧
↔
πEdα∧/≥Wεf↑7 hPQ!⊂JF},V∂&↑.αβ"ε5∩βkd∞@hP⊃∃ε?⊗\≡F/↔∧ε∩β
∀πSrεm≥@hP⊃∃ε?⊗\≡F/↔∧εBsαε5c2αV%∩βkd∞@hPα"*}Y8=↑\λ
∧εh ε$
(πWH≠Z-A"C"AQMB"∧∧λλ∀jXTHD<Y|aQA"H∧∧λλ
πd≡λ≡%∀~<h∞D~9H∂∧~<h∞>≤Z8nM≡(⊂∪\2pz2\⊂:40[⊂8V⊂_w2⊂7~v⊂7z~2y;t\pW⊂⊂≡⊂⊂0w→⊂<FEλ⊂⊂⊂⊂≠zyz_2P17]4⊂34↑5:vyH7y⊂!≠z4⊂#≠7w:v\UεEεBεA62\βsp λ LSQBR2 or more args
α lEqsp Compares iTq argumentq which must be numbers, from left to righ If any argument is not less than the next, lessp returns nil. But if the
arguments to lessp are strictly increasing, the result is t. Examples:
(lessp 3 4) => t
(lessp 1 1) => nil
(lessp -2 3.6 4) => t
(lessp 0 2 1 3 4) => nil
March 3, 1979 ∪2-6.2 Page 2-67
Maclisp Reference Manual
< SUBR 2 args
(< x y) is t if x is strictly less than y, and nil otherwise. x and y
must be both fixnums or both flonums.
max LSUBR 1 or more args
max returns the largest of its arguments, which must be numbers. If any
argument is a flonum, the result will be a flonum. Otherwise, it will be
a fixnum or a bignum depending on its magnitude.
min LSUBR 1 or more args
min returns the smallest of its arguments, which must be numbers. If any
argument is a flonum, the result will be a flonum. Otherwise, it will be
a fixnum or a bignum depending on its magnitude.
Page 2-68 ∪2-6.2 March 3, 1979
Numbers
6.3 Conversion
fix SUBR 1 arg
(fix x) converts x to a fixnum or a bignum depending on its magnitqde.
Examples:
(fix 7.3) => 7
(fix -1.2) => -2
(fix 104) => 104
ifix SUBR 1 arg
(ifix x) converts x from a flonum to a fixnum. ifix will never return a
bignum, unlike fix. This allows it to be efficiently open-coded. This is
not the same function as IFIX in Fortran; rounding is down rather Than
towards zero. It is like ENTIER in Algol.
ifix does not exist in the Multics implementation.
float SUBR 1arg
(float X) coNverts x to a flonum∞ Example:
(float 4) => 4.0
(float 3.27) => 3.27
abs ↓ SUBR 1 Arg
(abs x) => |x|, the absolute value of the number x. abs could have been
defined by:
(defun abs (x) (cond ((minusp x) (minus x))
(t x) ))
¬
March 3, 1979 ∪2-6.3 Page 2-69
λ ↓ Eaclisp RefeRence Mafualλ
(hP4Y⊂N↑b"(∧∧λ∀u(*Hλ ≡Yc"AP¬⊂⊂⊂λ⊂6tg≥yP⊂)→z:y7≤P:42H⊂72`'ativE kf its argument$ whicH can be any `↔Sαs⊃β?0h)↓↓α↓β;Wn∪↔I9αα↔cπoβ3↔MPh(4(HI#π≥nW
β∃∀βkr¬V⊂hPα"*
]8π:yH⊗YW≠
P≡←⊂W≠εEβAαE$_tx0y≥∧DP⊂λ⊂)ba∀⊂→⊂ \3yFEβE⊂⊂⊂λ⊂⊂40Zx0p∩t x n) extracTpε@A\↓YKCI%]N@A=` ↓β'∪ππ3Ls≥βM#@~αj&}j∧
FF*
⊂NL<[X-A Hλ∧∧λ≤Y.∞Y<q-n_9~-⎇H≠qD∂ Hλ∂∧≠8>$Y(_$Z>≠N](≠tD(_Z,]]; ↔λ⊂7⊂6]yz⊂1→P⊂0@→4|7:[U
The valqe Iq retqr`≥K⊂ACf∪∧AMCq9kZA←H@ABA SO]k4\∪∪LATASβ→↓βC␈≠'S'6)1βSF(4)↓α↓↓βK/≠W3Qαβ∂?;&';MαβS#∃εq↓β#L;!7∨⊗#↔I↓π≠'∨;L3'∂πw!↓βM#@~ε|a↔gGE`λ∧∧∩9H∧
H~4aQHλλ∧∧≠Y9l≡~=Y%D≥~→$∞Y<⎇-Nλλ_m⎇]_:-nh≥~T∨≠←∧
≠⎇c-}Y→<D∧_Z=∞∀≠yH∂O≥@∧ 9Hλ∂M←λ∩.1"Hλ∧∧λ_Z,|y<H∞M_;H∞M→(≠N]8Y<D
yH≤m≤{Z1M≤x;]∧X9≤d
;H≡¬D∨≡∨∧
<h∀L↑≥<[L\C"AQB16≥<≠→.↔C"B$∧λλ
:8λ0\:⊂→Z
[≠P≠JP≡←⊂Y→εEβEP⊂λ⊂∀40Zx0q:λ→Z~[
P∩ZTH≡←⊂→
FEεEαP⊂⊂⊂
40tx_y:⊂⊗LZ~[≠H⊗ZTP∂←⊂→≠CEαEεBεEεEβEαEεBεEεEβEεEεBεEεEβEεEεBεEεEβE(0sYP→⊗[L∧DDPλ⊂⊂ Y[↔→DBDP⊂⊂∪py1tλ→R_N[\FEβ∧DDDH⊂⊂⊂'≥vq2y≤β
α6.∀ ArithmeTic
λ
General Aradhmadic
~∀@A)Q∃g@∃β5+;∂SN{;Mβ>K3 "∞Wε6}-Rε∂-≡FFn↑M⊗~α
ybε∞o∀ε↑∞l@ε}2
nVn⊗↑.2bα≥f"ε≥Nv∂O1Q'NN]LBε∞dWF∞>A↔⊗/>]G"b←ε≡/∞Dπ>F]dπ/≡\@απ>≡Mαε6M⎇g.o5dααDmIvw.↑4αεF≡hRεf≥]↔&.AQ'π⊗\=↔<9{H≥Yλ∀L≥Yy+E∀⊂{sNl<\p∀[w9P⊂≥4π fLonum↓←dA¬%K]kZ↓aKae∃cC]i¬iS←\ACeJ↓I←]J4∃CfA9KKIK⊂\@@A→Y←]k4AeKaIKgK]QCiS←8@AoS1XAEJ↓kgKHASLA¬]r@A=HAiQ∀@ACe≥k[K]QfACe∀~∃MY=]k[flA←iQ∃eoSg∀AMSq9kZAe∃aeKg∃]iCi%←\Ao%YXAE∀AkgK⊂ASLAQQJAe∃gkYh↓GC\@↓MShA%\~∃M%q]kZ↓M←eZ0A←dA SO]k4AeKaIKgK]QCiS←8ASLA%hAGC9]←h\4∀~∀@A)QJ↓io↑AMKGiS=]f@A¬MiKd↓iQSf↓←]J@↓IKgGISEJA=iQKd↓CeSi![KiS∪Mk]
iS←]LAoQS
P~∃CIJA[←IJAKM→SGSK9hAEkPAYKgLAa←o∃eMkX8~∀~∃AYkf∩$@@@A1'+¬$`A←d↓[←eJ↓CeOf4∀~∀@@@Aa1kfAe∃ike]LAiQJ↓gkZA=LASiLACeOU[K]iLXAoQ%GPA[¬rAEJ↓C]rA-S]HA=LA]k5EKef8~∀~∀4∃ISM→KeK]
J∩@@A→'+ $@bA=dA[←IJACe≥f~∀~(@@@@↓ISMM∃eK]G∀AeKiUe]fA%ifAM%eghA¬eOk[∃]hA[%]kfAQQJAe∃ghA←_ASif↓CeOk5K]if8@A∪h4∀@@@Ao←e-fAM←HAC]r↓WS]H↓←LA]U[EKeL\~∀~(~∃iS5Kf∩∩@@A→M+¬$@@A←dA5←eJA¬eOf~(~∀@@@AiS5KfAe∃ike]L@AiQ∀Aae←⊃kGh@↓←LASQfACe≥k[K]Qf\@@↓∪hAo=eWf@↓M←dA¬]r∪W%]HA←_~∀@@@A]k5EKef8~∀~∀4∃ck←QSK]h$@@@A1'+¬$bA←d↓[←eJ↓CeOf4∀~∀@@@AcU←iSK9hAeKQke]f↓SifA→Segh↓CeOk5K]hA⊃SmSI∃HAEr↓iQJAIKghA=L@ASQfACe≥k[K]Qf\~∀@@@AQQJACIOk[K9ifA[¬rAC]dAWS]⊂A←LA9k[EKH\~∀~(∪qC5aYKfh~∀∩@Qck←QSK]hf@dR@z|@D∩@@@wMSq9kZAI%mSgS=\AieU]GCi∃f\~∀4∀∩@@!ck←i%K]h@L@d\`$@z|@b\j@wEkh↓MY←]UZAISYSgS←8AI←KLA]←h8~∀~∀$@@QcU←iSK9h@l\@@b\j@d\`$@z|@H\`~∀4∃≠Ce
P@fXbrnr$∩∩@@@&dZX\h∩∩$@@@@@A!C≥J@dZ\b~∀_∩∩∩@A≠C
YSg`↓%KMKIK]GJ↓≠C]k¬X~∀~(~∃CI⊂b∩∩@@A'+ $@bA¬eN~∀4∀@@@@QCI⊂bApRz|Ap,b\@A`A[Cr↓EJAC9rAWS9HA←L↓]k[E∃d\~∀4∀~∃gUDb∩∩@@A'U¬$@b↓CeN~(~∀@@@@QgUDbAp$@z|A`Zb\@↓pA[CdAEJA¬]rAW%]HA←_A]k[ Kd\~(~∀~∃IK[CS9IKd∩@@A'U¬$@d y) => the remainder of the division of x by y. The sign of
the remainder is the same as the sign of the dividend. The arguments must
be fixnums or bignums.
gcd SUBR 2 args
(gcd x y) => the greatest common divisor of x and y. The arguments must
be fixnums or bignums.
expt SUBR 2 args
z
(expt x z) = x
The exponent z may be a bignum if the base x is 0, 1, or -1; otherwise z
should be a fixnum. x may be any kind of number.
As a special feature, expt allows its second argument to be a flonum, in
which case the first argument is converted to a flonum and the
exponentiation is performed in floating point, using logarithms. The
result is a flonum in this case.
*dif SUBR 2 args
*dif is a subr form of difference. It is documented here because some
people use it. There is no reason to use it, since the compiler
automatically converts difference into *dif as required.
Page 2-72 ∪2-6.4 March 3, 1979
λ NumbeRq
α*auo ↓ SEBR 2 @¬eOf~(∩∧@@@@ECU↑@ARβ→β¬↓¬≠WI∧∧f␈⊗β(λ
|H≤=-}~93NEHλλ ≡λ~ →H⊂27a]vrw:→p⊂42\2P⊂!→qpp∃MJAg←αk∀4 α↓↓↓βα+?C3*↓βGN*↓β'QpJS#↔⊗)↓β'α4αε@Yh⊂→→pyw`. to qsE it, since the c@←αkC'3-⊂$ ↓α↓↓βεαP≥
⎇89~,<9≠⊗${{]L↑]_ P≤zsz4Yw:⊂)npo *qug ¬`
βK-G'K,!0$λhP4Pβ"C!"C"AP¬
λ↓α
∀4Ph (!Q h↓@εEεB¬
∀4Ph (!Q h⊂β"C!αAεEβA
λ
∧~(~(Q!PDn≤,6Bβ5Dβ↓-n"!⊂(λλ∧αlC ≠~∧DDH⊂⊂⊂⊂λ⊂( sYP→ε@6∧f~∀⊂∩α∩@A7∞≠3'OααK↔≠(ε&.v<T∧n∞n\⊗`@ ¬εEβA Fi@a]cZA¬aSiQ5KiSF4⊂∀(hQ↓↓α&C↔O∃αβ∪@.βPe
≥{\h∞,<90∀\2P⊂ 4he`∪dα↓βπK?+7.β]≤d∞≠hλ,(→@∀↑0εums and prodqce onl`24⊃MSQ9kZβ⊗+GW3'→1↓αL1↓βSF)βCK,∧@O⊗↑8
-Nα⊂ whicH wou1H@AE∀AeKiU`;⊗ ∧αε↔∀∧π&FT V␈⊗QQ&.9Q0→_v⊂3 5ncti@=]f@A⊃KgGe%EKHAAaKmSα{WO3Jaβ'MαβS>tλ≡Yy(∞MβP⊂1→P92x≤2yrg≥2r⊂⊂_yP0FB34p_num, The requlTACGiUCYYr↓eKiKβ∪;↔⊃π;'31αβ∃β'∪W;∂∂#↔⊃β&y↓βπpβ'7Cd∧Vn∞β]_.M;{C!QY→<]Y→3ND≠];,,<H⊂↔Yα bitpεXAo!SGPA%`
↓M2q↓#'v≠3@.M→f:πMRπ≡≤⎇bJε≥dπεFT∧∧o.NM⊗∨~≥f h,Gαk⊗∧εNo
HVn∞β]_.M;{\edλ∃~T_{s.
;→<D∞≤[y∞\y<h
9z≠∂∀9|≥
≥:>Q,D_{qTλ→[n$≥~→.<#"Sn<X=
≥{\kAQA"Ja⊃(λλ∧ ∀u0J$λ≠n∧≠;|LT_8Yn1"C"D∧λλλ¬4≤Y=∞↑Y\h∞M→(λ∞>;(≠ld~=≤d<Y⎇-\9]≤edλλ∃
(_<L};9;NNh≠=.>λ_Y$∧→Z>
n;<k∧;Yβ!$λλλ∧∞~→(∞,<⎇;∞D~<h≥≥x>.4_(→M∨≠];%dλ⊃>≥<≠→.7C"C!!"*
dεH
H¬V*(∂'d
c"A⊃*
hε5(∂/Dεb.⎇∞-=Z8-D_x<lQ"B"%¬j(∂'dα.m≤→;]
≡≡(→-L;9;NA"C"AQK""$∧λλ∪
:0THε∧≠|H
]|Y(≡Y|c!!"Hλ∧∧λ∃~
≡hλ~.4λ≥~T→Z>
n;+;mm≡"<n\]≤X,>~;{D∧→];L>~;{Ea5z=
∧λ≠{LTλ_<L};9;NEλ~=↓QHλλ∧∧≤Y=∞↑[\h∞M→(≠N]8Y<D}hλ≠L\x=~-⎇KHλ
⎇=~λ
]|Y(∧∞~_;D
{Y(≡Y⎇;,]]λ∧
=λ≤L↑≥<[N1"Hλ∧∧λ≥~T→Z<N>λ_<L};9;ND≠:;N↑h≥~T≤Y<nD≠yH∞M→(_.,⎇;9-n≤kC!!"B"%¬*(∂'dλ∞M→(~,L;]~.O(→;]9;]↓QB"*¬Tj(πWH,aQB"*¬T
(e∀∂/Hε!"B"%¬(Hεd,*$π/H&1"B9.LkC"AQC"JA⊃(λλ∧ ∀u0J$λ≠n$≠;|LT_<Yn1"C"D∧λλλ¬$≤Y=∞↑[\h∞M→(≤∞-y≥8nD≠yH
≡≤h_.,⎇;9-n≤kH∧λ>_;.
→<nAQC"B!∃
H
∧ε(-E∀∂/H¬V,LAQB"*¬$j(πWHb$∧λλλπ>≤Z=M≤;λ_l≡y#"A⊃*
J$π/H!∀λλλ∧πz9→-n~=≡$;→;,]]β"AQC"C!*_9y$εK-m↓⊃"(λ∧∧∧lK&eMα"!∀λλ∪,≡Xzλε5λ.&w#"@↓A"""$∧λλ∪N]8Y<N1"C"AQKb"$∧λλ∪
:0THε∧≠|H
]|Y(≡Y|c!!"Hλ∧∧λ∃~
≡h~<d∞~→(m>≠]-U;{[∂∀→~=M≡z;{D];XnM;{KD∧∃~→$<Y⎇-\;]≤d
=<⎇∧∧_Y(m>≠]-↑c"H∧∧λλ_-lλ≥~T≤Y<n]≥λ≠ld≥~→$~=Z.=;{H
≡h≥≤N]Xx=\λ≥≠d;H~-n→9y.$_;Y∧∧≤Y=∞↑YY9∧<c"D∧λλλ∀→Z>
n;+B)m⎇→(∧∞~_=∧∞~→(
l;9(∧
yH≥
<h→N]X⎇~-⎇H≠=.>λλ_LT≥≡<\λ~3D∧_<h¬ukβ"D∧λλλ∞=9Xq$ ~<|∧∞<y<d¬h_<d;H→.≤x<⊃$z_<L≤⎇→<EA C"D∧λλλ ≤H≥<l\λ≥z.Mλ≠;n,(≥~≥H≠sLT_8Yn]9;]¬D~=λM=Z1↑h≥~T→Z<N>λ_<L};90↔≥⊂⊂1<H:42FB⊂⊂⊂⊂λ92yzλ5s⊂⊂≥42P0\3zvr[:9W⊂λ$s⊂⊂≥yrb≥tz4≠w6<Pλ7w2P_y3zfYw:⊗⊂~z⊂⊂)→z:y7≤P:42CA⊂⊂⊂λ⊂34l≠:vP⊂≤2qtx≤5qpvλ⊂7s⊂λ:40zλ⊂7:vX2y⊗⊂≥t4qtλ⊂4yPλ⊗XV⊂λ_⊂ 1 _@A=` βWv#↔πv+⊂4$∧αααLWε.lM⊗v:
ybπ≡X
<H⊂~~2P7:[q2y is -⊃, larg`
X@DXA←∧`\
∀4∀∩@@@@@@ ↑↑@%βiy↓EbβS#∃εK∪↔;&KSeβ,c↔7↔w!0$λJ↓↓↓↓α↓↓!≤z↓IAdεRJβWdβ h!∀ααα∧∧ααBβkhε⊗Hε4J(πWH%Ea"B(∧∧λλλ∧=_kAQ@εEεB_UDDλ⊂⊂⊂)Ua)⊂_H0y3FBεA⊂⊂λ⊂⊂∀_JP<∀P∂←⊂<∃LU⊂⊂,λ6zyzλ12P0H34|7≥vW⊂⊂∃42P9→yzv*λ4yP0[9ptiH0P3$↑7:vWβEαEεB_VDDH⊂⊂⊂)Ua)⊂_H0y3FBεE⊂⊂λ⊂⊂∀_KP<∀P∂←⊂<⊗LW⊂⊂<λ6zyzλ12P0H34|7≥vW⊂⊂∃42P9→yzv*λ4yP0[;p|yH0P3$↑5:vGβEαEεB,∧DPλ⊂⊂)jP)⊂→_y3yFBεE⊂⊂λ⊂⊂∀.λ<⊂<TH92z:\71P:~2P⊂9→vptw→2y⊂'Y⊂<⊂2~{4r2Y⊂1<Pλ<V⊂+Zz4⊂:~2P9tYw⊂7cλ⊂<↔⊂λ<εE⊂λ⊂⊂⊂0[2⊂<P≠zyz⊂_2P34↑5:vyK⊂⊂"|_vx6"\]εEεB∧P⊂⊂λ⊂⊂⊂∀↔⊂~P→
P≡←⊂FE∧Pλ⊂⊂⊂⊂λ∀.⊂≠
W⊂⊗\K∀P≡Oλ→εE∧H⊂⊂⊂⊂λ⊂∀.⊂[~W⊂∞W∀P≡O⊂⊗YεBεEεE↔,∧DPλ⊂⊂)jP)⊂→_y3yFBεE⊂⊂λ⊂⊂*4~yP9zX9⊂7cλ⊂:;wH0y3z[rs:9H4yP6~urP⊂→qr⊗⊂_:z⊂7[6<P0Xqrx:≤P⊂34↑7:vyK⊂⊂*4~yFE⊂λ⊂⊂⊂6XuryP~z⊂30\z2y⊂≥40w⊂→qr↔εBεEεE∪py1tλ→V⊂_N[\DDBP⊂⊂⊂∧Y⊗[↔
∧DDPλ⊂⊂⊂⊂λ(0srH→⊗[ZCEβ∧DDPλ⊂&pq[4yx⊂∀2s2y→w1rP∪pw:p[εEεEβE/∧DH⊂⊂⊂)Ua)⊂→λ0y3yCEεE⊂λ⊂⊂⊂/λ4yP:~2P34↑7:vP≠w6<P→|87w→w:4p]4ww⊂→:w1z~ww↔⊂λ$z⊂4\P9wvY{t0zλ⊂30y]2y⊂:~0wεEλ⊂⊂⊂⊂→|8:⊗λs returfs a fixjum result, which will be incorrect if the true
result is too large to be represented as a fixnum.
Page 2-76 ∪2-6.4 March 3, 1979
Numbers
Flonum Arithmetic
These functions requiRe their arguments to be flonums$ and always produce
fhonum results. If the true result is too large op too small to be represented
as a flOnum, an arithmetic underdlow or overflow error will occur. (In the
pdp-10 implementation these errors are not detected in compiled programs.) The
compiler produces highly-optimized code for these operations.
+$ LSUBR 0 or more args
+$ returns the sum of its arguments.
Examples:
(+$ 4.1 3.14) => 7.24
(+$ 2.0 1.5 -3.6) => -0.1
(+$ 2.6) => 2.6 ;trivial case
(+$) => 0.0 ;identity element
-$ LSUBR 0 or more args
This is the flonum-only subtraction function. When used with only one
argument, it returns the number's negation. Otherwise, it returns the
first argument minus the rest of the arguments.
(-$) => 0.0, the identity element
(-$ x) => the negation of x.
(-$ 6.0 2.5) => 4.5
(-$ 2.0 1.5 -3.6) => 3.1
etc.
*$ LSUBR 0 or more args
*$ returns the product of its arguments. Examples:
(*$ 3.0 2.0 4.0) => 24.0
(*$ 6.1) => 6.1 ;trivial case
(*$) => 1.0 ;identity element
March 3, 1979 ∪2-6.4 Page 2-77
Maclisp Reference Manual
/$ LSUBR 0 or more args
This is the flonum-only division function. Note that the name of this
function must be typed in as //$, since Lisp uses / as an escape
character. This function computes the reciprocal if given only one
argument. If given more than one argument, it divides the first by the
rest.
(//$) => 1.0, the identity element
(//$ 5.0) => 0.2
(//$ 6.28 3.14) => 2.0
(//$ 100.0 3.0 2.0) => 16.5
etc.
1+$ SUBR 1 arg
(1+$ x) => x+1.0. x must be a flonum. The result is always a flonum.
1-$ SUBR 1 arg
(1-$ x) => x-1.0. x must be a flonum. The result is always a flonum.
↑$ SUBR 2 args
↑$ is the flonum-only exponentiation function. The first argument must be
a flonum, the second must be a fixnum (repeat, a fixnum), and the result
is a flonum. To raise a flonum to a flonum power, use (expt x y) or (exp
(*$ y (log x))).
Page 2-78 ∪2-6.4 March 3, 1979
Numbers
6.5 Exponentiation and Logarithm Functions
sqrt SUBR 1 arg
(sqrt x) => a flonum which is the square root of the number x. This is
more accurate than (expt x 0.5). The following code, which is due to
Gosper, should be written if the square root of a bignum is desired. It
is essentially a Newton iteration, with appropriate precautions for
integer truncation.
(defun bsqrt (n)
(bsqrt1 (abs n)
(expt 2 (// (1+ (haulong n)) 2))))
(defun bsqrt1 (n guess)
((lambda (next)
(cond ((lessp next guess)
(bsqrt1 n next))
(t guess)))
(quotient (plus guess (quotient n guess))
2)))
exp SUBR 1 arg
x
(eXp x) => e
log SUBR 1 arg
(log x) => the natural logarithm of x,
March 3, 1979 ∪2-6.5 Page 2-79
Maclisp Reference Manual
6.6 Trigonometric Functions
sin SUBR 1 arg
(sin x) gives the trigonometric sine of x. x is in radians. x may be a
fixnum or a flOnum.
cos SUBR 1 arg
(cos x) returns the cosine of x. x iq in radians. x may be a fixnum or a
flonum.
atan SUBR 2 args
(atan x y) returns the arctangent of x/y, in padians. x and y may be
fixnums or flonums. y may be 0 as long as x is not also 0.
Page 2-80 ∪2-6.6 March 3, 1979
Numbers
6.7 Random Functions
random LSUBR 0 to 2 args
(random) returns a random fixnum.
¬
(rafdom nil) restarts the random sequencE at its beginning.
(random x), where x is a fixnum, returns a random fixnum between 0 and x-1
inclusive. A useful function is:
(defun frandom ()
(//$ (float (random 10000.)) 10000.0)))
which returns a random flonum between 0.0 and 1.0.
(random n1 n2) setq the random number seeD from the pair of integers n1,
n2.
zunderflow SWITCH
If an iNtermediate or final flonum result in the interpretive arathmetic
functions (timas, *$, expt, etc.) iq too small in magnitu`e tk be
represeNted by the machine, corrective action will be taken according to
the zenderflow switch∞
If the value of zunderflow is non-nil, the offending result will be set to
0.0 and computation will proceed. If the value of zunderflow is nil, an
error will be signalled. nil is the initial value.
In the pdp-10 implementation compiled code is not affected by zunderflow
if the arithmetic in question was open-coded by the compiler. Instead,
computation proceeds using a result with a binary exponent 256 higher than
the correct exponent. In the Multics implementation zunderflow works the
same for compiled code as for interpreted code.
See (sstatus divov), which controls division by zero (part 3.7).
March 3, 1979 ∪2-6.7 Page 2-81
Maclisp Reference Manual
6.8 Logical Operations on Numbers
These functions may be used freely for bit manipulation; the compiler
recognizes them and produces efficient code.
boole LSUBR 3 or more args
(boole k x y) computes a bit by bit Boolean function of the fixnums x and
y under the control of k. k must be a fixnum between 0 and 17 (octal).
If the binary representation of k is abcd, then the truth table for the
Boolean operation is:
y
←←←|←0←←1←
0| a c
x |
1| b d
If boole has more than three arguments, it goes from left to right; thus
(boole k x y z) = (boole k (boole k x y) z)
The most common values for k are 1 (and), 7 (or), 6 (xor). You can get
the complement, or logical negation, of x by (boole 6 x -1).
The following macros are often convenient:
(defun logand macro (x)
(subst (cdr x) 'f '(boole 1 . f)))
(defun logor macro (x)
(subst (cdr x) 'f '(boole 7 . f)))
(defun logxor macro (x)
(subst (cdr x) 'f '(boole 6 . f)))
Page 2-82 ∪2-6.8 March 3, 1979
Numbers
Alternatively, these could be defined with macrodef (see part 6.2):
(macrodef logand x (boole 1 . x))
(macrodef logor x (boole 7 . x))
(macrodef logxor x (boole 6 . x))
lsh SUBR 2 args
(lsh x y), where x and y are fixnums, returns x shifted left y bits if y
is positive, or x shifted right |y| bits if y is negative. Zero-bits are
shifted in to fill unused positions. The result is undefined if |y| > 36.
The number 36 is implementation dependent, but this is the number used in
both the Multics and pdp-10 implementations. Examples:
(lsh 4 1) => 10 (octal)
(lsh 14 -2) => 3
(lsh -1 1) => -2
rot SUBR 2 args
(rot x y) returns as a fixnum the 36-bit representation of x, rotated left
y bits if y is positive, or rotated right |y| bits if y is negative. x
and y must be fixnums. The results are undefined if |y| > 36. As with
lsh, the number 36 depends on the implementation. Examples:
(rot 1 2) => 4
(rot -1 7) => -1
(rot 601234 36.) => 601234
(rot 1 -2) => 200000000000
(rot -6 6) => -501
The following feature only exists in the pdp-10 implementation.
The internal representation of flonums may be hacked using these
functions. lsh or rot applied to a flonum operates on the internal
representation of the flonum and returns a fixnum result. For example,
(lsh 0.5 0) => 200400000000 (octal). The following function also exists:
March 3, 1979 ∪2-6.8 Page 2-83
Maclisp Reference Manual
fsc SUBR 2 args
(fsc x y) performs a FSC instruction on the two numbers x and y, and
returns the result as a flonum. Consult the pdp-10 processor manual if
you want to use this.
x and y may be fixnums or flonums; fsc just uses the machine
representations of the numbers. If y is greater than 777777 octal, the
FSC instruction is omitted and the possibly-unnormalized flonum with the
same machine representation as x is returned.
Page 2-84 ∪2-6.8 March 3, 1979
Character Manipulation
7. Character Manipulation
7.1 Character Objects
An atomic symbol with a one-character pname is often called a character
object and used to represent the ascii character which is its pname. In
addition the atomic symbol with a zero-length pname represents the ascii null
character. Functions which take a character object as an argument usually also
accept a string one character long or a fixnum equal to the ascii-code value
for the character. Character objects are always interned on the obarray (see
page 2-58), so they may be compared with the function eq.
ascii SUBR 1 arg
(ascii x), where x is a number, returns the character object for the ascii
code x.
Examples:
(ascii 101) => A
(ascii 56) => /.
getchar SUBR 2 args
(getchar x n), where x is an atomic symbol and n is a fixnum, returns the
n'th character of x's pname; n = 1 selects the leftmost character. The
character is returned as a character object. nil is returned if n is out
of bounds.
March 3, 1979 ∪2-7. Page 2-85
Maclisp Reference Manual
getcharn SUBR 2 args
getcharn is the same as getchar except that the character is returned as a
fixnum instead of a character object.
maknam SUBR 1 arg
maknam takes as its argument a list of characters and returns an
uninterned atomic symbol whose pname is constructed from the list of
characters. The characters may be represented either as fixnums (ascii
codes) or as character objects. Example:
(maknam '(a B 60 d)) => ab0d
implode SUBR 1 arg
implode is the same as maknam except that the resulting atomic symbol is
interned. It is more efficient than doing (intern (maknam x)), although
it is less efficient than plain maknam which should be used when interning
is not required.
readlist SUBR 1 arg
The argument to readlist is a list of characters. The characters may be
represented either as fixnums (ascii codes) or as character objects. The
characters in the list are assembled into an S-expression as if they had
been typed into read (see part 5.1.) If macro characters are used, any
usage in the macro character function of read, readch, tyi, or tyipeek not
explicitly specifying an input file takes input from readlists's argument
rather than from an I/O device or a file. This causes macro characters to
work as you would expect.
Examples:
(readlist '(a b c)) => abc
(readlist '( /( p r 151 n t / /' f o o /) ))
=> (print (quote foo)) ;ascii 151 = "i"
Note the use of the slashified special characters left parenthesis, space,
quote, right parenthesis in the argument to readlist.
Page 2-86 ∪2-7.1 March 3, 1979
Character Manipulation
explode SUBR 1 arg
(explode x) returns a list of characters, which are the characters that
would be typed out if (prin1 x) were done, including slashes for special
characters but not including extra newlines inserted to prevent characters
from running off the right margin. Each character is represented by a
character object. Example:
(explode '(+ /12 3)) => ( /( + / // /1 /2 / /3 /) )
;Note the presence of slashified spaces in this list.
explodec SUBR 1 arg
(explodec x) returns a list of characters which are the characters that
would be typed out if (princ x) were done, not including extra newlines
inserted to prevent characters from running off the right margin. Special
characters are not slashified. Each character is represented by a
character object. Example:
(explodec '(+ /12 3)) => ( /( + / /1 /2 / /3 /) )
exploden SUBR 1 arg
(exploden x) returns a list of characters which are the characters that
would be typed out if (princ x) were done, not including extra newlines
inserted to prevent characters from running off the right margin. Special
characters are not slashified. Each character is represented by a number
which is the ascii code for that character. cf. explodec. Example:
(exploden '(+ /12 3)) => (50 53 40 61 62 40 63 51)
flatsize SUBR 1 arg
(flatsize x) returns the number of characters prin1 would use to print x
out.
March 3, 1979 ∪2-7.1 Page 2-87
Maclisp Reference Manual
flatc SUBR 1 arg
(flatc x) returns the number of characters princ would use to print x out,
without slashifying special characters.
Page 2-88 ∪2-7.1 March 3, 1979
Character Manipulation
7.2 Character Strings
These character string functions only exist at present in the Multics
implementation of Maclisp. A predicate to test if your implementation has
these functions is
(status feature strings)
These functions all accept atomic symbols in place of strings as arguments;
in this case the pname of the atomic symbol is used as the string. When the
value of one of these functions is described as a string, it is always a string
and never an atomic symbol. Also see the functions on page 2-56.
catenate LSUBR 0 or more args
The arguments are character strings. The result is a string which is all
the arguments concatenated together. Example:
(catenate "foo" "-" "bar") => "foo-bar"
index SUBR 2 args
index is like the PL/I builtin function index. The arguments are
character strings. The position of the first occurrence of the second
argument in the first is returned, or 0 if there is none. Examples:
(index "foobar" "ba") => 4
(index "foobar" "baz") => 0
(index "goobababa" "bab") => 4
stringlength SUBR 1 arg
The argument to stringlength must be a character string. The number of
characters in it is returned. Examples:
(stringlength "foo") => 3
(stringlength "") => 0
March 3, 1979 ∪2-7.2 Page 2-89
Maclisp Reference Manual
substr LSUBR 2 or 3 args
This is like the PL/I substr builtin. (substr x m n) returns a string n
characters long, which is a portion of the string x beginning with its
m'th character and proceeding for n characters. m and n must be fixnums,
x must be a string.
(substr x m) returns the portion of the string x beginning with its m'th
character and continuing until the end of the string. Examples:
(substr "foobar" 3 2) => "ob"
(substr "resultmunger" 6) => "tmunger"
get←pname SUBR 1 arg
(get←pname x) returns the pname of x as a character string. x must be an
atomic symbol.
make←atom SUBR 1 arg
make←atom returns an atomic symbol whose pname is given as a character
string argument. Contrary to previous editions of this manual, this
atomic symbol is interned. Example:
(make←atom "foo") => foo
Page 2-90 ∪2-7.2 March 3, 1979
Arrays
8. Arrays
As explained in part 1.2, an array is a group of cells which may contain
Lisp objects. The individual cells are selected by numerical subscripts.
An array is designated by a special atomic object called an array-pointer.
Array-pointers can be returned by the array-creation functions array and
*array. An array-pointer may either be used directly to refer to the array,
or, for convenience in referring to the array through input/output media, it
may be placed on the property list of an atomic symbol under the indicator
array, and then that symbol can be used as the name of the array.
There are several types of arrays. The main types are ordinary arrays,
whose cells can hold any type of object, and number arrays, whose cells can
only hold numbers. Number arrays permit more efficient code to be compiled for
numerical applications, and take less space than an ordinary array which
contains the same number of numbers. See the array* declaration (part 4.2) and
the arraycall function (page 2-14).
When an array is created its type must be declared by giving a "type code."
The type code for ordinary arrays is t. For number arrays, the type code is
either fixnum or flonum. A particular number array can only hold one type of
numbers because its cells contain the machine representation of the number, not
the Lisp-object representation.
Some other types of arrays are: un-garbage-collected arrays, with a type-
code of nil, which are the same as ordinary arrays except that they are not
protected by the garbage collector and therefore can be used for certain
esoteric hacks; obarrays, with a type-code of obarray, which are used to
maintain tables of known atomic symbols so that the same atomic symbol will be
referenced when the same pname is typed in; and readtables, with a type-code of
readtable, which are used to remember the syntax specifications for the Lisp
input reader. Normally, there is only one readtable and one obarray, supplied
by the system, but the user may create additional readtables and obarrays in
order to provide special non-Lisp environments or to gain additional control
over the Lisp environment. Lisp functions such as read can be made to use an
additional readtable or obarray by re-binding the variable readtable or
obarray, respectively.
March 3, 1979 ∪2-8. Page 2-91
Maclisp Reference Manual
An array-pointer may also be dead, in which case it does not point to any
array. One of the functions array, *array, or *rearray may be used to revivify
a dead array-pointer.
The functions array and *array are used to create arrays. The first
argument may be an atomic symbol, which makes that atomic symbol the name of an
array, putting an array-pointer on its property list, or redefining an array-
pointer that was already on the property list to point to the new array.
Alternatively the first argument may be an array pointer, which causes that
array pointer to be redefined to point to a new array, or it may be nil, which
causes a new array pointer to be created and returned. Except in the latter
case, array returns its first argument. *array always returns the array
pointer, never the atomic symbol.
A readtable or an obarray may not be created with user-specified dimensions.
The dimensions are always determined by Lisp. Other types of arrays allow any
reasonable number (at least 3, anyway) of dimensions to be specified when they
are created. The subscripts range from 0 up to 1 less than the dimension
specified.
Ordinary and un-garbage-collected arrays are initialized to nil. Fixnum
arrays are initialized to 0. Flonum arrays are initialized to 0.0.
Obarrays are initialized according to the third argument given to array or
*array. nil causes a completely empty obarray to be created. Not even nil
will be interned on this obarray. t causes the current obarray (value of the
symbol obarray) to be copied. An array-pointer which is an obarray, or an
atomic symbol which names an obarray, causes that obarray to be copied. If no
third argument is given, the current obarray is copied.
Readtables are initialized in a similar fashion. If the third argument of
array or *array is nil, then the current readtable is copied. If it is t, then
the readtable being created is initialized to the initial standard Lisp
readtable, including the macro characters ' and ;. (Note that this is the
opposite of the t-nil convention for obarrays. This is for compatibility with
the makreadtable function, which no longer exists.) An array-pointer or symbol
of a readtable to be copied may also be given. If no third argument is given,
the current readtable is copied.
An array-pointer may be redefined to an entirely different type and size of
array, using the *array function. It remains the same array-pointer, eq to
itself. If a variable was setq'ed to the array-pointer, that variable will now
Page 2-92 ∪2-8. March 3, 1979
Arrays
indicate the new array. If a symbol has that array-pointer on its property
list, it will now be the name of the new array.
The *rearray function can be used to redefine the size or arrangement of
dimensions of an array without losing its contents, or to make an array-pointer
not point to any array (become dead). If there is only one argument, the
array-pointer is killed, the array's contents are discarded, and the array-
pointer becomes a "dead array" as described above. *array may now be used to
redefine it as a new array.
If more than one argument is given to *rearray, they are the same arguments
as to *array. *rearray with more than one argument cannot be used to change
the type of an array, and cannot operate on a readtable or an obarray, but it
can be used to change the dimensions of an array. The modified array will be
initialized from its old contents rather than nil, 0, or 0.0. The elements
are taken in row-major order for initialization purposes, and if there are not
enough, nil, 0, or 0.0 will be used to fill the remaining elements of the
modified array, according to the type.
The Multics implementation also has a type of arrays called external arrays.
External arrays reside in a Multics segment rather than within the Lisp
environment. They behave much like fixnum arrays, and should be declared as
such to the compiler. To create an external array, use a form such as
(array foo external pointer length)
The pointer is a packed pointer to the beginning of the array, i.e. a fixnum
whose first six octal digits are the segment number and whose second six octal
digits are the word address. The length is the number of words in the array.
External arrays can only have one dimension, can only contain fixnums, and are
not initialized when they are created. They cannot usefully be saved by the
save function. This type of array can be used for communication between Lisp
programs and Multics programs or subsystems written in other languages, when
large amounts of numerical data or machine words must be passed back and forth.
See also defpl1 (part 4.6).
If you want the range of subscripts on arrays to be checked, it is necessary
to set the *rset flag non-nil (i.e. run in (*rset t) mode) and to avoid the use
of in-line array accessing (i.e. the array* declaration) in compiled programs.
The amount of checking performed when *rset is nil and/or compiled code is used
depends on the implementation.
March 3, 1979 ∪2-8. Page 2-93
Maclisp Reference Manual
Here is an example of a use of arrays:
(defun matrix-multiply (arr1 arr2 result)
(and (eq (typep arr1) 'symbol) ;convert arguments
(setq arr1 (get arr1 'array))) ;to array-pointers
(and (eq (typep arr2) 'symbol)
(setq arr2 (get arr2 'array)))
(and (eq (typep result) 'symbol)
(setq result (get result 'array)))
(do ((ii (cadr (arraydims result))) ;get relevant
(jj (caddr (arraydims result))) ;dimensions
(kk (cadr (arraydims arr2))))
()
(do i 0 (1+ i) (= i ii) ;result := arr1 x arr2
(do j 0 (1+ j) (= j jj)
(do ((k 0 (1+ k))
(r 0.0))
((= k kk)
(store (arraycall flonum result i j) r))
(setq r (+$ r (*$ (arraycall flonum arr1 i k)
(arraycall flonum arr2 k j)
)))))))
result)
*array LSUBR 3 or more args
(*array x y b1 b2 ... bn) defines x to be an n-dimensional array. The
first subscript may range from 0 to b1 minus 1, the second from 0 to b2
minus 1, etc. y is the type of array, as explained above. It may be
chosen from among: t, nil, fixnum, flonum, readtable, obarray.
array FSUBR
(array x y b1 b2 ... bn) has the same effect as (*array (quote x) (quote
y) b1 b2 ... bn). This special form is provided for your typing
convenience.
Page 2-94 ∪2-8. March 3, 1979
Arrays
*rearray LSUBR 1 or more args
*rearray is used to redefine the dimensions of an array.
(*rearray x) kills the array-pointer x, or the array-pointer which is the
array property of the atomic symbol x. The storage used by the associated
array is reclaimed. The value returned is t if x was an array, nil if it
was not.
(*rearray x type dim1 dim2 ... dimn) is like (*array x type dim1 dim2 ...
dimn) except that the contents of the previously existing array named x
are copied into the new array named x. If it is a multi-dimensional
array, row-major order is used. This means the last subscript varies the
most rapidly as the array is traversed.
store FSUBR
The special form (store array-ref value) is used to store an object into a
particular cell of an array. The first element of the form, array-ref,
must be a subscripted reference to an array, or an invocation of
arraycall. By coincidence, certain other forms work as array-ref, for
instance (apply f l) where f turns out to be an array. The second
element, value, is evaluated and stored into the specified cell of the
array. store evaluates its second "argument" before its first "argument".
Examples:
(store (data i j) (plus i j))
(store (sine-values (fix (*$ x 100.0)))
(sin x))
(store (arraycall fixnum az i j) 43)
arraydims SUBR 1 arg
(arraydims x), where x is an array-pointer or an atomic symbol with an
array property, returns a list of the type and bounds of the array. Thus
if A was defined by (array A t 10 20),
(arraydims 'A) => (t 10 20)
March 3, 1979 ∪2-8. Page 2-95
Maclisp Reference Manual
fillarray SUBR 2 args
(fillarray a l) fills the array a with consecutive items from the list l.
If the array is too short to contain all the items in the list, the extra
items are ignored. If the list is too short to fill up the array, the
last element of the list is used to fill each of the remaining cells in
the array.
(fillarray x y) fills the array x from the contents of the array y. If y
is bigger than x, the extra elements are ignored. If y is smaller than x,
the rest of x is unchanged. x and y must be atomic symbols which have
array properties, or array-pointers. The two arrays must be of the same
type, and they may not be readtables or obarrays.
The list-into-array case of fillarray could have been defined by:
(defun fillarray (a x)
(do ((x x (or (cdr x) x))
(n 0 (1+ n))
(hbound (cadr (arraydims a))))
((= n hbound))
(store (a n) (car x))
)
a)
An extension to the above definition is that fillarray will work with
arrays of more than one dimension, filling the array in row-major order.
fillarray returns its first argument.
listarray LSUBR 1 or 2 args
(listarray array-name) takes the elements of the array specified by array-
name and returns them as the elements of a list. The length of the list
is the size of the array and the elements are present in the list in the
same order as they are stored in the array, starting with the zero'th
element. If the array has more than one dimension row-major order is
used.
(listarray array-name n) is the same, except that at most the first n
elements will be listed.
Page 2-96 ∪2-8. March 3, 1979
Arrays
array-name may be an array-pointer or an atomic symbol with an array-
property.
Number arrays may be efficiently saved in the file system and restored by
using the functions loadarrays and dumparrays.
loadarrays SUBR 1 arg
(loadarrays file-spec) reloads the arrays in the file, and returns a list
of 3-lists, of the form:
( (newname oldname size) ...)
newname is a gensym'ed atom, which is the name of the reloaded array.
(newname ought to be an array-pointer, but this function was defined
before array-pointers were invented.) oldname is the name the array had
when it was dumped. size is the number of elements in the array.
dumparrays SUBR 2 args
(dumparrays (array1 array2 ...) file-spec) dumps the listed arrays into
the specified file. The arrays must be fixnum or flonum arrays.
In both of the above, the file-spec argument is dependent on the system.
In ITS or DEC-10 Lisp, the file-spec is a list of zero to four items, as
in uread, and the same defaults apply. In Multics Lisp, the file-spec is
an atomic symbol or a string which gives the pathname of the segment to be
used. The defaults and other features of the Lisp I/O system are not
applied. Only a segment may be specified, not a stream.
As a special compatibility feature, in Multics Lisp loadarrays will
recognize a pdp-10 dumparrays file. (One can be moved to Multics through
the ARPA Network File Transfer Protocol if the "type image" and "bytesize
36" commands are employed.) The pnames will be converted to lower case
and flonums will be converted to the H6880 machine representation.
dumparrays can create a file which pdp-10 loadarrays can read, including
upper-case pnames and pdp-10 format flonums, if it is invoked as follows:
(dumparrays (array1 array2...) '(pdp10 file-spec))
March 3, 1979 ∪2-8. Page 2-97
Maclisp Reference Manual
Page 2-98 ∪2-8. March 3, 1979
Mapping Functions
9. Mapping Functions
Mapping is a type of iteration in which a function is successively applied
to pieces of a list. There are several options for the way in which the pieces
of the list are chosen and for what is done with the results returned by the
applications of the function.
For example, mapcar operates on successive elements of the list. As it goes
down the list, it calls the function giving it an element of the list as its
one argument: first the car, then the cadr, then the caddr, etc., continuing
until the end of the list is reached. The value returned by mapcar is a list
of the results of the successive calls to the function. An example of the use
of mapcar would be mapcar'ing the function abs over the list (1 -2 -4.5 6.0e15
-4.2). The result is (1 2 4.5 6.0e15 4.2).
The form of a call to mapcar is
(mapcar f x)
where f is the function to be mapped and x is the list over which it is to be
mapped. Thus the example given above would be written as
(mapcar 'abs
'(1 -2 -4.5 6.0e15 -4.2))
This has been generalized to allow a form such as
(mapcar f x1 x2 ... xn)
In this case f must be a function of n arguments. mapcar will proceed down the
lists x1, x2, ..., xn in parallel. The first argument to f will come from x1,
the second from x2, etc. The iteration stops as soon as any of the lists is
exhausted.
There are five other mapping functions besides mapcar. maplist is like
mapcar except that the function is applied to the list and successive cdr's of
that list rather than to successive elements of the list. map and mapc are
like maplist and mapcar respectively except that the return value is the first
list being mapped over and the results of the function are ignored. mapcan and
March 3, 1979 ∪2-9. Page 2-99
Maclisp Reference Manual
mapcon are like mapcar and maplist respectively except that they combine the
results of the function using nconc instead of list. That is,
(defun mapcon (f x y)
(apply 'nconc (maplist f x y)))
Of course, this definition is far less general than the real one.
Sometimes a do or a straight recursion is preferable to a map; however, the
mapping functions should be used wherever they naturally apply because this
increases the clarity of the code.
Often f will be a lambda-type functional form rather than the atomic-symbol
name of a function. For example,
(mapcar '(lambda (x) (cons x something)) some-list)
The functional argument to a mappingfuncTion must be acceptable to apply -
it cannot be a macro. A fexpr or an fsubr may be acceptable however the
results Will be bizarre. For instafce, mappingsat works better than mapping
seTq, and mappingcond is unlikeLy to be useful.
¬
It is permissible (afdobten useful) To break out of a map by use od aeo,
retu@I\XA←HAiQe=nAS\↓BAYC5EIB[QsaJA→k]Gi%←\AE∃S]NA5CaaK⊂X@A)!SfASβ→↓β¬ε&.f∨↔&N⎇aPV}d∧π&FT∞W∨.≥Dαππ-⎇εN⊗≡M⊗}r≤v∞Nβ\⎇∧∧λ[[me;≠xl≥λH→mt|hλ≥Yλ⊂→→z:y7 yW⊂⊂λ$s⊂⊂→wP7yβA92z≥y3∧`)pε@AkMKH@AQQJAaI←OeC4@A[Cd@AQCYJ@Ai<AEJ@↓G←[a%YKH@↓oSiPAiQJ@Q[CAKpAh$~∃IK
YCeCQS←\XAIKa∃]IS]≤A←\@↓iQJA%[aYK5K]iCQS←\XAg↑A]CiGPα↓β?W" ↓↓α≤{;O'&+IβSFKL4+7+;∂SN{9β←FK∂!βO→βO'nK3πI¬#=βπv!1β↔F≠↔CQ¬##πQ∧KQβ←␈∪ ∨~
ybε
I↔∂"D
-n⎇→8,D≠yH
⎇C"@→Yx0q0]2P0y→zvr`.ts&
defp\A¬]IX@!pR
∀@@@@QGC
P~)α↓↓↓↓α↓#CK};84(JC7πC~↓#≠Wv≠S'?r↓# &≥\&&
¬∂∩Hh!⊃⊂Jα¬
w∩π∀¬π&G-}rεv≥Dπ&FU\⊗w∨|↑"JJ¬∃⊂hP∀∧ααα∧∂αHh!~BHh$∧ααα∧∧π&FU\⊗w∨|↑"JHQ!PRα∧λ⊗&n≡NF.&O∀π&F≡4ε≡␈]LBε⊗T&/'LZ"ε/∞∞&/∨<\Bε∂4∩ε&w!PPh!Q h⊂Q*ε∞>Tε"kε↓⊂HJ∧∧αα↓6%SJp⊃⊃∩αα \↔⊗≡∧ε2bβ↔⊗sHh `H⊃∀ααα∧∧α∧n≡∞εNvtλg.v>M⊗}w1Q hPQ!PRα∧∧ααFL\g.r≥f&b¬∂αHh$∧ααα∧∧αF&t¬αGJ∂∧αF≡N$πJJ∃⊃PPJ∧∧αBFn]Fbπ∃∀π"HQ!∩F␈$¬ε≡∂$∩Jα∞,W'/-dεvNE∃⊂hR∧∧ααα¬∃⊂hPQ!PRα∧∧αα∧↑&*ε≡4ε
πL≤&f*∞=ε␈>≥lrπ&Tπ⊗.L≡FN}n4ε⊗/N|V.r∞Mε*π=∨αεn≡∧ε7.l>FN}n5`hPQ!⊂HH∀∧ααε≡∞εfN↑4ε7.l:FN}d∞Fxh!Q HH∀∧ααα∧∧πbα∞>V≡≡↑>6O6T∧πbα∧∞7.≡<↑7≡OlTαπ`Q!⊂HJ∧∧ααα∧∂Bαα∞>V⊗f≡>G~α∧∂Bαα∧Vf.\]g'~∧∧π`h!⊃∩jjUURjjUURjjUURZjUURjjUURjjUURZjUURjjUURjjUURjXQ!⊂Jα∧∧εO'4
w>r∧∧απ`∀∧ααα∧∂@HJ∧∧ααα∂APPH∀∧ααπ<\6}vD∧ααα∂Dααα∧
V∂α∧∧ααα∂Dααα∧
V∂ε4∧ααα∧∂@hP⊃∀ααε≡,w.n]nBαα∧∂@Jα∧∧ααπA⊃∩αα∧∧απ`Q!⊂JjUURjjUURjjUURjZUURjjUURjjUURjZUURjjUURjjUURjj1Q HJ∧
FO∨D
v $≥~→$∧∨α(∧∧λλλ∂A"(λ∧∧λλ∨↓QHλλ∧∧λ≤Y.Nαy79BP⊂⊂3≥w1z4[w⊂⊂⊂λ>⊂⊂⊂λ6px&~yz⊂⊂λ>⊂⊂⊂λ6px1Xy⊂⊂⊂λ⊂>εEαDP⊂⊂λ92yz[89P⊂λ⊂>∧Pλ⊂⊂⊂⊂∨∧DP⊂λ⊂⊂⊂>βE -----
---------+--------------+----
----
-----+
λ ncOnc o@_AaQJ↓x∩@@@@Ax$∩@@@@Ax~(∩∩@@AMk]
iSO\@Ah@@A[CAG←\@@Ah@@A[CAGCL@@@Ax4⊂∩α@@AeKMkYif@@Ax$@@@@Ax∩∩@@@@↓x~(HI555hi555hi555hi-55hi5%5h¬RjJUQRZjUQRjJUP%U++#%Uc"C!α@
mapato@5`¬↓α↓α2∞αX%∩β∀λn⊂→ !pgs
∀@@Q@7π∧S >↑4ε&↓Hλ⊂↔X0q ∩ay) App` SKL@AiQ∀AMK≥
iSO\αβ⊗Hλ⊂~≠P0v&λ⊂:42H9xvq≠v9P⊂≠w⊂:4→FA!@pecifIe`λA↑α∪πK↓,∨∩`$λ∩0∪λ842P≤β`G≡εs⊃↓β∂∪∨.XPND~8h
⎇89≥\λε QQJAεπ+CK↔w!↓β?⊗CKπJβ'L∀TεW∞9@⊂λ'0∂te phat the `∂ECI`πd∧∧↔ε?]\Vwα
↑W∂"∧λ&*ε≥`ε∂⊗∧X>%↑≠z0↔≥2y⊗⊂≠5z⊂⊂_P9|`-bkl
whicH jamepεAC\↓Ce@K∂I0∩αλMε*π?_,,βv⊂/bab@e¬rAS@~β?Wt!βC=∞FF* p_L≡X 0|H⊂12@)ng mappeD
λh∂mKβ⊃β∪W⊗K;≥β&C∃β↔F+∂WSL¬frε|dεn∞≡F}o5aP@ ¬⊂λ*4$@3 funCti`∨\αβ↔c'α:G4_Y0l≡8y(∞ain single symbols, and user programs shouldn't have
to know this.
Example:
March 3, 1979 ∪2-9. Page 2-101
Maclisp Reference Manual
(mapatoms
(function
(lambda (x)
(and (sysp x)
(print (list x (sysp x) (args x))) ))))
Page 2-102 ∪2-9. March 3, 1979
Part 3 - The System
1. The System
1.1 The Top Level Function
The following function is an approximation to what Maclisp does when it is
at its "top level."
March 3, 1979 Page 3-1
Maclisp Reference Manual
(defUn standard-top-level nil
(prog (↑q ↑w ↑r evalhook base ibase ... )
errors ;errors, uncaught throws, etc. come here
↑g ;ctrl/G quiTs come here
(reset-bound-vars-and-restore-pdls)
(setq ↑q nil)
(setq ↑w nil)
(setq evalhook nil)
(nointerrupt nil)
(do-delayed-tty-and-alarmclock-interrupts)
;Recall that errors do (setq // errlist) so lambda-binding
; errlist will work properly. See errlist.
(mapc (function eval) //)
(or (status linmode)(terpri))
(do ((eof (list nil)) ;internal variables
(prt '* *))
(nil) ;do forever (until ↑g or error)
(setq * (cond ((status toplevel)
(eval (status toplevel)))
(t (terpri)
(cond (prin1 (funcall prin1 prt))
(t (prin1 prt)))
(typ 40)
(setq (do ((form))(nil)
(setq form
(cond (read
(funcall read
eof))
(t (read eof))))
(or (eq form eof)
(returf form))
(terpri)))
(and (julL read)
(atom -)
(is-a-space (tyipeek))(tyi))
((lambda (+) (eval -))
(prog2 nil + setq + -)))))))))
¬
Which causeq a "read-eval-print loop," i.e. eAch S-expression that is typeD if
g`iF↓KmCYUCiKHαβπ;⊃αβS#∃π3π3W*β'Mβπ∪';S.!1↓β&C↔9β&C∃β;-CQαMn+cCK/≠O'∨r↓β'Mπ∪↔π⊃ph*↔K⊗{KMβ∞s⊃α{8βGW' βS-β&{A↓βd+[↔1p↓αS#∂!β'Mπ##↔eπ∪↔'≠M#'π3OS∃βπv!↓βSF+9βK*k↔;S/⊂4(∀Ph*Cπ>)↓M5⊂H$%↓α↓MMk 1D∧HI↓↓αnC∂!β→1↓EK9d4( $$HI↓αSF)αOG∨#↔44Ph ((¬~
≡h≠∪m} λ∞∞X;]
≥Yh⊂!∃H
_N↑α;[nD→→<nNYz ∀[3Dz4→P;0v≥p¬ Od∧AiQ∀@AmCISCEY∀@TR\4∃≥←I%GBAi!ChAi!KeJA%`
↓βλ∧πεF≤8RεNd
FF*
]⊗&<απ>Z&*πMRπ∞<XDx;@⊂~w9r@2p `ILAWo\4⊃gaKα≠'π⊃∧f␈⊗T
Fzε,Tε/6≥JV∂&\@∧∞<r3LTλ∧9y]0z2`3 top1KmKX$X@A∪PASfA¬Yg↑AA←ggSα∪3∃β&x4+∂F;∨∃∧SWOQ∧εFF*∞,V∞→<@
}H∩U.≡λ≥~T≤≤Z-n→<@⊂_<P9b\8Stg→β read or prin⊂,∧∪'K∀AiQJ4⊃ggi¬icFA→c]Gi%←\@QACGJ@LZfn∩8~∀4R↓↓α[∂∪'πd∧W4≥<p∩Y⊂1<P≥42P*≠x⊂
L∃mKX@β∪↔π⊃n+[π⊂oβK'≠ β3∂?βP4(Q% HJ∧∧α¬4~)∧∀HQP@HαHλ∧∧λ⊂p↔[:0tg≤β the last S-expreSpπC@?p∧ππ⊗≥nF.α∧ w∂"/∩πεTαπ⊗\≤Bn=P;¬↑≤Z3ND≠≠p↔\⊗εE⊂λ⊂⊂⊂4hadAαC@~↓λ≥~T≥X;∞≤αP'@& phe h CGhαβ6↓|[ ⊂≤∧qpE@⊂AS@9p∧α¬& ⊂d
<h⊂~≤αpJ@α+[↔→αβπ6¬→0→λ0p∞
erbo@HAeKiUaDAi<A`∪>αβ#↔≠(¬Bbε≥H
}z;Yd
yQ(∞πP92Y2q⊂4o the p
CYUJ@A`β∪'+S,∧Bε@⎇=β!⊂⊂⊂⊂λ12sop¬JAi!JACE=a`∪⊗ ∧ε≡}↑∞W&∞M_meA"C!⊃DDPλ⊂⊂ ⊗ARIABA
∀~(@@@@↓β←]i¬S]fAβ##∃α¬@λ.≡λ∀k,←≤≤Y.≡x;sD∞_∧`0D¬HAS\8∪!QRβ→β∂πp∧ε⊗*∞↑6.λ≥≠d9~0~λ⊂4r≠y
Q↑AI↑↓ShA↑β3↔Iα∧≤v∞NβK@⊂λ∀ ∞OQSGJA!←n@Vαβ'Mβ⊗{W;⊃∧¬εrπMRαπ,Xλ,E9=X-E<≤Z-nα⊂6/op ≤~(@@@@↓)QSF↓GCkgα+@~ααh~≠P92`#eivE the CorreCt valq`
A
β3↔)βH∧bπ&Tαε/l≥G.∂M_md_8[n∞α9VεB⊂⊂⊂⊂λ9tw1YP0w erro@HAWdAy@
βG,CQβ←Nc "π]lFzπMRε⊗α;Y
≥Yk@∀↓
~∀4∩∩@@A-β%!β¬→
4∀∩)α↓↓↓α_¬vw&≥→g4≥~→$∧_⎇4N2w:⊂∀Vr|8≤2yyd[w⊂:<\2r⊂⊂~w↔⊂⊂∃44yP_pw⊂⊂_2P:yYr⊂⊂1≡P:yb\⊗FE⊂λ⊂⊂⊂;\αitten eRp¬WdA!C]IY∃`M_LKQβ∂∞q∨Q↓∧∪∃βW≤+∪G∪gI↓βπ≡≠↔OO,!↓βJβ↔cC⊗+GO'}sL4)α↓↓↓β'KC↔⊃εK91β≤K;∂∃∧KQβ'~βO↔Q∧∪↔≠?⊗)βS#*β↔cC⊗+OO'}qβ'Mε+[π3.S↔⊃ph(4)α↓αeπ≠C↔∂N1↓β∂∪Cπ;>+7↔;"βS#∃π3π3W/→↓β?2↓-1↓αQ1βπv!↓4'∂∪∃βC⊗+O↔K4+⊃↓β∞≠K?O~β∧4+↔∪↔π-pJ←#↔rβS#∃ε∪K↔πZβ'Mβ6KKOQε+;S↔⊗+⊃βSF+O∃βF[∃β&C∃β[∞cW↔Mε3?Iβ&C∃β3∂≠QβS␈↓44+f+[↔1ε{C↔K∂#'?9bβ∪WKNs≥↓β&C∃β⊗+π-β&C↔e↓ε∪↔#π6)βS#*βOπ7*↓βπMεQβS␈↓↓β3/3↔11ε;⊂4V≠S↔∩βS#∃ε∪K↔πZβK↔S/∪;Mβ&C↔eβ∂∪∃βK/≠S?K.!βS=π##∃β63W↔~β≠?Iπ##∃β&{Aβ3/3↔1βf{?A8hQ"O↔*βK↔∞Y1βC∞;∃↓Mk)%84Ph)<$J↓↓↓α4
J&ε∀b∀4(hQ↓↓↓α↓=β'~βWO↔"βS=β&+7C?⊗K'3Jβ#?3"↓βS#*β[π3.)β?→ε+KK3O≠Qβ←F+9βπr↓β↔K⊗{IβK/#WK;_h)↓↓α↓βS=π#?Aβf+[↔1r↓αS#O→β'Mπ≠=βSFQβ3∞k∪¬n∪';∪Ns≥β↔↔∪3'O"β←'3bβ#π[*↓βπ9ε+≠≠↔∨ 4)↓α↓↓↓#∂≠OW7Ns≥β;z↓β?;*β3π7⊗#¬7Ns∪M↓zI9↓↓∧s?S∃π##πQα↓=β7/≠Qβ(KSgC.!β'9αβπM↓zx4)↓α↓↓βONs∂∃β&C∃βOfO!β≡CπKπ∨#↔IβO→βOC.≠'π1π#=βSF)α2& Maclisp Reference Manual
errlist VARIABLE
The value of errlist is a list of forms which are evaluated when control
returns to top level either because of an error or when an environment is
initially started. It doesn't apply if the environment started up was
saved using (suspend). This feature is used to provide special error
handling for subsystems written in LISP.
The symbol errlist is evaluated to get the list of forms in the binding
context in which the error occurred, but the forms themselves are
evaluated in the top-level binding context.
Example:
((lambda (errlist)
(putprop 'foo 'bar 'baz)
(hack)
(remprop 'foo 'baz))
(cons '(remprop 'foo 'baz)
errlist))
The property list of foo will be properly restored even if the computation
(hack) is aborted.
Page 3-4 ∪3-1.1 March 3, 1979
The System
1.2 Breakpoints
Breakpoints are a mechanism to allow the user to gain control at any point
in a program. Use of the function break causes a read-eval-print loop, similar
to the one at top level, to be entered. (This is also called a break loop.)
The user may evaluate any S-expressions, inspect the bindings of variables, and
exit from the break in several ways. Normal execution then proceeds. (See
page 2-43 and page 3-31)
This mechanism can be used to permit human intervention when an unexpected
condition occurs. It is used in this way by the Maclisp error system. See the
section on Exceptional Condition Handling, page 3-15. A break loop makes the
full power of the LISP interpreter available for debugging.
break FSUBR
(break tag pred) evaluates pred, but not tag. If the value of pred is not
nil, the state of the I/O system is saved, ";bkpt tag" is typed out, and
control returns to the terminal. We say that a "break loop" has been
entered. tag may be any object. It is used only as a message typed out
(using princ) to identify the break. It is not evaluated. If pred is
omitted, t is assumed. Thus (break tag) is equivalent to (break tag t).
(break tag nil) returns nil, and produces no action whatsoever.
A break loop is a read-eval-print loop similar to top level. break does
an errset so that errors cannot cause an abnormal return from the break.
A ↑x quit, which causes an ordinary error, will thus return to the break
loop if used to interrupt a computation started in the break loop. A ↑g
quit, however, returns back to LISP top level, resetting the environment
using the errlist, as described above.
Two forms, $P and (return x), may be typed in a break loop. If $P is
typed in, break returns nil and execution continues. This "$P" is
<dollar> P in the Multics implementation, but <altmode> P in the PDP-10
implementations, followed of course in either case by a <space> or
<newline> as appropriate (see (status linmode)). (An atom other than $P
can be used to perform this function by changing the value of $P to
another (non-nil) atom. The initial value of $P is always $P).
If (return x) is typed in, break evaluates x and returns that value. If
March 3, 1979 ∪3-1.2 Page 3-5
Maclisp Reference Manual
as a result of the evaluation of a typed-in form, (throw x break) is
evaluated, break returns x as its value. (Notice the distinction -
executing a form (return x) does not return from break unless it was typed
directly at the break loop.) See return, page 2-43.
When break returns, the state of the I/O system is restored.
An approximate LISP definition of what break does follows. Note that the
user program can modify this by using (sstatus breaklevel).
Page 3-6 ∪3-1.2 March 3, 1979
The System
(defun break fexpr (x)
(*break (eval (cadr x)) (car x)) ;note argument reversal
(declare (special ↑q ↑w evalhook * + -))
(defun *break (breakp breakid)
(and breakp
(do ((↑q nil) (↑w nil) (evalhook nil) (terpri t) (* *) (+ +) (- -))
() ;bind key variables
(terpri msgfiles) ;msgfiles arguments
(princ '|;bkpt | msgfiles) ; used for
(princ breakid msgfiles) ; Newio only
(terpri msgfiles)
(setq + -) ;last form typed
(return
(prog2 nil
(catch
(do () (nil) ;do forever (until throw)
(errset
(do ((eof (list nil)) (form))
(nil)
(cond ((status breaklevel)
(eval (status breaklevel)))
(p (setq form (cond (read (funcall read eof))
(t (read eof))))
(and (null read)
(atom form)
(is-a-space (tyipeek))
(tyi))
(cond ((eq form eof) (terpri))
((and $P (eq form '$P)) (throw nil break))
((eq (car form) 'return)
(throw (eval (cadr form)) break))
(t (setq - form)
(print
(setq * ((lambda (+) (eval form))
(prog2 nil + (setq + -)))))
(terpri))))))))
break)
(terpri)
))))
March 3, 1979 ∪3-1.2 Page 3-7
Maclisp Reference Manual
The arguments to break are a breakpoint identification and (optionally) a
break switch. If the break switch evaluates to nil, then nil is returned.
Otherwise, the variables ↑q, ↑w, evalhook and terpri are bound to nil, the
variables *, +, and - are bound to their current values, and the message ";bkpt
<breakid>" is printed. A read-eval-print loop similar to the top level loop is
then entered. This break loop is surrounded by an errset. Errors or typing ↑x
merely cause the break loop to be re-entered. The value of (status breaklevel)
serves a function similar to that of (status toplevel) in the top level loop.
As each form is read in the default break loop, there are four cases:
1. End of file. For console input this merely indicates rubout beyond
the number of input characters. Whether input is from console or
elsewhere, the (terpri) is done and the reader is entered.
2. The form is the atom $P or eq to the non-nil value of $P. nil is
returned from the break.
3. The form is (return value). The form value is evaluated and returned
from the break.
4. Otherwise the form is evaluated and the result printed out in a manner
analogous to the top level read-eval-print loop. The variables +, -,
and * are updated appropriately. (Recall, however, that they were
bound on entry to *break, and so will be restored eventually.)
The way to return from a break is to do a throw with a tag of break; this
will return from the catch which surrounds the break loop. This is how cases 2
and 3 return their values; case 4 may also cause a return from the break.
Page 3-8 ∪3-1.2 March 3, 1979
The System
1.3 Control Characters
LISP can be directed to take certain actions by entering "control
characters" from the terminal. The difference between control characters and
normal input is that control characters take effect as soon as they are
entered, while normal input only takes effect when LISP asks for it, by use of
functions such as read, or by being in the top level read-eval-print loop or in
a break loop.
Control characters can be typed in from the terminal according to some
procedure that depends on the implementation. A program can mimic the effects
of the various control characters by directly calling the function associated
with the particular control key (see below).
Although control characters are usually processed as soon as they are typed,
they may be delayed if there is a garbage collection in progress or LISP is in
(nointerrupt tty) mode - see the nointerrupt function (page 3-18).
Entering Control Characters in ITS LISP
In the ITS implementation of Maclisp, control characters are entered by
means of the "CTRL" key on the terminal. For example, CTRL/g is entered by
holding down "CTRL" and striking the "G" key. Control characters normally echo
as an uparrow or circumflex followed by the character.
In Newio, any character at all may be made an interrupt character. See
(sstatus tty) and (sstatus ttyint).
Interrupt characters are also read as part of the terminal input stream.
Normally they are marked in the readtable as "worthless" characters.
Entering Control Characters in TOPS-10 LISP
Most control characters may be entered in the same way as in ITS LISP if
LISP is currently read'ing from the terminal. If a LISP program is actively
running, it is necessary to first gain its attention by typing the CTRL/c
character one or two times, thereby returning to the monitor. The monitor
command REENTER may then be used to re-enter the LISP. LISP will print "?↑"
and read a character, which may be a control character or a character whose
"control" meaning is to be used. Thus typing either ↑g or "G" will cause the
↑g interrupt to occur. If LISP is not ready to take an interrupt, there may be
a delay before the "?↑" is printed.
March 3, 1979 ∪3-1.3 Page 3-9
Maclisp Reference Manual
EnteringControl Characters in Multics LISP
In the Multics implementation of Maclisp, one siGnals one's desire to enter
a "control" character by Hitting the "attention" key on the terminal. (This is
called "break," "interrePt," "attn, ∧@@EEkShXλAKiF8A←\A⊃SMMKIK]h@↓iKe[%]CIF8@A∪L4∃≠kYQSGfA%bAEK%]NAC
GKgg∃HAiQI←kOP↓iQJA¬%!αA9Kio←IVXAC8@ES]QKeekAh@AaI←GKgLD@Q↓L~∃&A=` αα~α%αAε3C?5ε αR&αIβO'>sπ1β≡C?W3"β∃β'∪π;OnKSS↔"q%α2M~AβK/≠C?;'→↓βJβSgCNs≤4+␈+Q↓
≥"J1=⊂q↓α;␈9βg?*β7πeπ#gC∃ε{;∃βd+SS↔∩β≠K?jβS#∃εc'OQεcπS↔∩β'9↓π##'Mπ≠↔∂SN{904W;#'∂B↓β←'fa↓β*↓β';&+KCK/#↔⊃↓π#=↓βF[∀'O#M↓↓⊗≠?;S⊗{1λ'n+π;'v99↓↓¬##'Mε≠?;S⊗{04+≡CπKπ∨#↔Iβo+OQβ⊗)β≠?fc?←↔ βeβ
β;↔←fK;∃8hP4)↓αα'QβO→βπ3≡y↓βC␈≠O'f)βS=ε+;S↔∩↓β∂?w#K?1∩↓β∂#∂∪π∂S/∪Eβ≠⊗{5βπpK';C/!β∂#∂∪π∂S/⊂4+O'∪↔π5bβ←#'≡Aβ7πJβ#π[(K'SMπ≠?WK≡)βπQπ##∃↓π#↔K7Nsπ1β␈⊃β'9ε9↓β/C↔∞␈≡{51β>KS#?/ 4+SF)βWO*β?→β&C∃↓∂#S↔;&K?9 ∧[↔e9ααS#∃ε#↔O'⊗+⊃β∂|sSK?bβ∂#π⊗∂S↔∩β'Mβπ∪↔≠'F+⊃βJβ∧4*c↓MYβ≡CπKπ∨#↔I9α↓α'→π#←=β}1↓βSF+O∃βπ∪↔≠'Bβ∂#π⊗∂S↔↔→↓β?≡≠WIβ&{∨↔SF+I1↓ε{;∃αc↓MX4V≠#πK∞≠S↔Iαβ'M↓π∪↔π⊃αβπ;⊃αβ;=↓⊗≠?;S⊗{1λ'∞≠S'?pK'M↓πβ↔K≠⎇∪7↔⊃pIα?SF+KO'≤)1βSF(4+∂FKπ∂&+Iβ≠|c3/←Ns≥βSF)αqA≠1β'MπβK?∂-≠O↔⊃εMβ¬∧≠?;S⊗{1β∂FKπ∂&+I1↓π##↔9π∪↔π∪Ns≤4+≡{;S'w+↔M8hP4)↓αα∂?;'∪?1β≡CπKπ∨#↔KMπ;'31ε∪∃βπ≡≠↔CS.!β'9π+CC↔∩β?Iβf{←↔Iε≠πO∃pIαπ3bβ∂#π⊗∂S↔↔_4+|Mε/∩∞Mε∞r∧∞FF␈<Tπ>OM↓⊗&.m≥f."
\V∞v≥lw~α≡&*π,]&.∨L\@O>≡Mαε∞d∧ε/↔-}"εn↑>6∞>UaPT}mO∩ε}lTε≡}nN&}b=ε∂⊗≤>F/∩
\↔Jε,Tε.wL↑&."≡Bε
∞M⊗n*aQ hR∧∧αααample for Multics LISP:
(lines containing user input are preceded by ">>>")
>>> (defun loop (x) (loop (add1 x)))
loop
>>> (loop 0)
function runs for a long time,
>>> <ATTN> then user hits attention button.
>>> CTRL/B LISP types "CTRL/", user types "B"
>>> ;bkpt ↑b system enters break loop
>>> x user looks at value of x
4067
>>> <ATTN> user hits attention button again
>>> CTRL/G and returns to top level
Quit
*
When a "user interrupt" is caused, if the interrupt is not enabled nothing
happens. If the interrupt is enabled, then a user-specified function is
called. The interrupt may be enabled by binding the appropriate symbol to the
function to handle it, or by using the (sstatus ttyint) function (page 3-78).
Page 3-10 ∪3-1.3 March 3, 1979
The System
In the following descriptions of control characters, those which can always
be processed immediately, even during a garbage collection or in (nointerrupt
'tty) mode, will be indicated by an "!" for the ITS and TOPS-10
implementations, and an "*" for the Multics Implemention. When appropriate,
equivalent LISP code is given for producing the same result from a user
program.
Control Characters that have initially defined meanings in all implementations:
B !* runs a break loop with breakid "↑b" (see break, page 3-5). (In the
PDP-10 Oldio implementation ↑h is used instead of ↑b.) (break ↑b).
C !* sets the value of the atom ↑d to nil, turning off garbage collector
messages. Because ↑c is trapped by DEC-10 monitors, this control
character can only be typed using the REENTER mechanism and typing
"C". (setq ↑d nil).
D !* sets the value of the atom ↑d to t, turning on garbage collector
messages. (setq ↑d t)
G quits back to the top level of LISP, rebinding all variables to their
global values, resetting various system variables, and evaluating the
errlist forms. This is used to stop a running program when there is
no intention of restarting it again. (Prints out a *; see the "top
level" function and the ↑g function.) H is used instead of ↑b in
some implementations (see above).
Q ! sets the value of the atom ↑q to t, enabling input from the source
selected by the value of infile, or selected by use of the function
uread. In the PDP-10 Newio implementation, this is not an interrupt
character; instead it is a macro character, and takes effect only if
processed by read. (setq ↑q t).
R ! sets the value of the atom ↑r to t, enabling output to the
destinations selected by the value of outfiles, or selected by use of
the uwrite function. (setq ↑r t).
S ! turns off typeout until input is read. This is used to suppress the
rest of the typeout from the current request, without affecting
typeout from the next request that is typed in. It is implemented by
setting ↑w to t, then putting a macro character in the input stream
which sets ↑w to nil and does a (terpri) when it is read.
March 3, 1979 ∪3-1.3 Page 3-11
Maclisp Reference Manual
T ! sets the value of the atom ↑r to nil, disabling output to the
destinations that CTRL/r enables. (setq ↑r nil).
U causes the current call to read to be restarted from the beginning.
(Not available in PDP-10 implementations).
V ! sets the value of the atom ↑w to nil, enabling output to the
terminal. (setq ↑w nil).
W ! sets the value of the atom ↑w to t, disabling output to the terminal.
(setq ↑w t) (and possible also (clear-output tyo)).
X causes an error which can be caught by errset. This is a less
drastic "quit" than CTRL/g. If it is typed within a break loop, it
will return no further than the break loop, since break uses errset.
(error 'quit).
Z !* On ITS returns to ITS command level, i.e. DDT. On Multics returns to
Multics command level. (start re-enters LISP.) On TOPS-10 goes to DDT
if a DDT has been loaded with LISP.
The following control characters only exist in the Multics implementation.
. !* does nothing, and is used merely to speed up a slow process by
causing an interaction.
? !* asks the LISP subsystem what it is doing: running, waiting for input,
collecting garbage, or running with tty-interrupts masked off.
The following control characters only exist in PDP-10 implementations with
the "moby I/O" capability. (For now, this means only at the MIT AI
Laboratory.) (see (sstatus ttyscan), page 3-81).
F Cause graphics display slave to seize a display.
N Turn on display for character output.
O Turn off display for character output.
Y Cause display slave to release display.
The following control characters only work in the PDP-10 implementation.
Page 3-12 ∪3-1.3 March 3, 1979
The System
They are not really interrupts, but occur only when processed by the terminal
input prescanner (see (sstatus ttyscan), page 3-81).
K redisplay the current input. This allows you to get a clean copy of
your input after rubouts have been used. (On a display console, LISP
will attempt to make rubbed-out characters actually disappear from
the screen. ↑k is still useful if a timing error disrupts this
process.)
L erases the screen if the terminal is a display, then does a CTRL/k.
Control-Character Functions
↑g SUBR 0 args
Produces a quit to top level just as if a CTRL/g had been typed.
These functions exist only in the PDP-10 Oldio and the Multics
implementations. They are being phased out, so using them in new programs is
not recommended.
ioc FSUBR
The argument to ioc is processed as if it were a "control character" that
had been typed in. Numbers are taken as a whole, atomic symbols' pnames
are processed character by character, except that nil is ignored.
Examples:
(ioc 1) causes user interrupt 1.
(ioc vt) switches output to the terminal.
(ioc q) switches input to a file.
(ioc g) quits back to the top level of LISP.
If ioc returns, its value is t.
March 3, 1979 ∪3-1.3 Page 3-13
Maclisp Reference Manual
iog FSUBR
iog first saves the values of the I/O switches ↑q, ↑r, and ↑w. Then it
processes its first argument the same as ioc. Next the remaining
arguments to iog are evaluated, from left to right. The values of the
variables ↑q, ↑r, and ↑w are restored, and the value of the last argument
is returned. Example:
(iog vt (princ "A Message."))
gets a message to the console no matter what the I/O system is doing. It
evaluates to "A Message."
(iog a x1 x2 ... xn)
can also be written
((lambda (↑q ↑r ↑w)
(ioc a)
x1
x2
...
xn)
nil nil nil)
Page 3-14 ∪3-1.3 March 3, 1979
The System
1.4 Exceptional Condition Handling
1.4.1 The LISP Error SYstem
The errors Detec@QKH@A r@Ai!J@A→%' @AMsgiK4@ACe∀@AISYSIKλAS]i<@Aio<Aica∃bd
∃
←eeK
iCEY∀@AC]⊂Ak]π=aeKGQCEYJ8@@A)!J@Ak9G←ee∃GiCE1JAKeI←ef@↓oSIXAEJA∃qaYC%]KH~)ISegβ!βO'v≠∃βSF+eβπ⊗)βO'oβ3↔Iph $)α↓απ9π+;∂?↔∪↔∂S∞∪3∃β-∪K/Iαβ'Mβ∞qβ↔K⊗{IβSFQ↓β≡WO↔~βS#∃ε+[π∪.S'?pβ'9↓¬;#'∂@β'P4Tp⊗≡∨↑.2π&tλ&*ε≤-w↔εX@D∧∃z→-d_;H∞≥X{tN8⎇_,-→(⊃.97q≠qqzi≤β λAi!JAM∪β∪@∨"∞MεNvt
FF∞AQ&F∞∞λ -nh∩0→H:42P≤90w:~w3P'Yα anerro@HASKgMC@∨∃p∧α∧NβH∪mL~;k∧∞~→(↑\[tD∧≠94n≤9y(⎇y<c!∞≠h⊂~~2P:2\0
`∪]¬XAC]⊂AU←↓>C↔K∃∧+3O∃αCW;∪-≠EβO/βCK↔≥≠↔⊃@l\(→0→≤αset0AaCO∀@f@4α"αJB
mphVβ0=∞L<H∀≠{P⊂*~2P$WRβ sWitchepεAC]⊂AeCe%CEIKL@ACE∀AgKh8∪∪@9∧s↔←'za↓βSF)βKπ⊗Kπ∪(h#/<|fNf↑4εO~⊂λ
<⎇⊂≠pε the fI@1KfAi<AgQR
PAKeI←dA≠∃`∂Oπ>+@~π=
w.fDλLTλ≤[n↑→1≥↓ phiL~∃@'vKS'πd¬GJε_4ε@.αyz phe Ter`≠∩αsπ1→ααS#∃∧+@↔⊗βp h@↔∂≤↔*λ0≠mnz0 J≤β of pπ←[J↓KqaYα;πS|ε'HhαP~2↑8∧ and ⊃kMkCIYβI%βSF)β>-( ,≡λ≠`→λ30∂@e4AaQCPAGC↓(ε6.λ≥~T→<\M}KC"A↓@
A`
@S,ε"πεTε/⊗∧[p→λ⊂6b@3pπCOJ↓QC@M∧∧&.8π⊂0p¬S@;&+⊃1↓∧6}vL∧[mD~0 P≤αed@*β∪;↔⊂εF`4λ≥~T≠;`→]¬∃↓⊗+∂.β]α,↑X[p→qp`∀cheb∞λThere i@&AC@9∧∧W.Xπ`25CCiGαC↔I↓∧QβS⎇↓↓β3,εf.bβ⊂⊂_w2⊂$p¬e@>α !QXx=<∧2y9H0y2P≤β`H↓∧εWαε)∀π&FTλ N↓u1z4[w⊂"@2p¬gKhα↓#πh ⊂_92puK⊂;t4Xt⊂:`3es eI`O↔ ¬α@$λ⊂;
@α@
@lαC'π⊗c∃↓β⊗K;∪'v;@~ε,X
∞|9;@⊂λ842Pλ2y ∩op-catcher↓C]H@↓iQJAA←SMhAgQJβ∪∃↓β&C∃β↔↔∪?HQ L<⎇<\L\λ_<LT≤Y<nMβy2b∧j4:\β all rabiabdeS are pestop¬KH@β#=βSF)βKπe+↔M↓∧εFF/∀ ε∞Q(↔"πMx∧
α2{"Z⊂7q_z⊂:4→P:4fYP:42H2y19Yz⊂;p\P27w→V⊂:w≠2yyP≥42|P≥ry2Pλ9rz8Irr⊂#≤2rFE
9tz4≠zz⊂ "eifG↓E←k]⊂R\
∀4∀@@A]QCh@↓QCaa∃]fA]∃q`⊃↓ε#↔C↔v#Mβ?r↓β#?:βS#∃αβ↔KK␈⊃7∂π&≠#↔I¬;πM↓π≠↔Qβ/↓8%α∂!βS?h+3↔6+11β&C∃β≠␈∪7Mβ}qβS#*β↔KKfKGQβ∂∪∃β↔63Wπ&+⊃βπv!βS#*βS/Aεc↔[↔bβ3??α↓#?Iε βWO/⊂4+Oε+∂'≠L+⊃↓β&{Aβ3/3↔1↓ε3?K5Jβ'L'⊗)7↔;&+K↔⊃r↓↓"SF)↓βONk?1ε+KK3O≠Q↓βO→β↔[∞cWπS. 4+C⊗K?Iβ&yβS#*βπ?6)↓βK/≠S?K∂#'?9ε{→βNs∪';?→1βπv!↓βO∂3↔⊃βNqβS#*β[πKN3∃α↓=9↓∧K84+&C'Mβ>eβSF)β↔K⊗c'OQπ+O↔⊃εKMβSF)β?;*β∂WK⊗+;Qβ∂!βS#*βS'7*β?→β&C∃↓β/∪K?Ibβ∪↔OεKS∀4W##∃β⊗+OS?⊗S'?rβ?→β⊗K;∪'v;M9%∧K→βπrβ↔KK␈⊃βK↔'+K;Mπ#=β⊗+π-1εKQβONkC3eπ∪∃7↔w#↔KLhS'SMπ∪↔π⊃n+[π1oβK';"β3??αq↓↓αNqβS#*α7W3&K∂M↓εK7C3.k↔;S∂#'?9π##∃β6∂Q↓π##πQε∪K↔πXh+#π~β∂πW>CQβπrβ↔KK␈⊃↓β'~βO'∨v33↔"βeβ⊗K;∨'v9βS#*↓β↔faβ?9π##∃β&+K7'v19↓αα'→β∞p4+↔↔∪?Iβ⊗+SWKw→↓βSzβ↔KK≡+Q1β/∪KO↔"↓βK↔'+K;Mεs'1β∞s⊃↓β/3π3W∂#'?9πβK?∂.+∪M9α↓α'→ε84+/∪K?Iπ∪↔SW⊗sMβSzβS?Aεc↔[↔baβS#*βOSπ&)β?→π##∃β>{K3⊃εKMβK/≠↔Qβ∞s⊃↓)εKMβSOβ↔⊃8hP4)↓ααS#∀N?[*β∪↔O∨∪'CSN{9↓βO→↓βOfK∨#SgIβO'oβ3'≠N+⊃9↓ααS#∃π+O↔HN≠π9↓π∪↔GW/≠Qβπph+';&+KKWπ!βS=αβ?∂∂/⊃β↔';↔↔9αβS#∃π#gC'v9β?→αβS#∃εk↔OO∞;∃1↓ε;⊃β&C∃↓β.s←';&K;≥β}04+Ns∪';?→βπ;"βK↔S/∪9β?2β∂?;'∪?1β&y↓βπrβ↔KK␈⊃7∂π&≠#↔Ir↓α'→π##∃β/∪K?IεKM↓β>{';≥π#<4(hP4*7∂∪∂!↓~a↓Ee;H$$%α↓↓M~iE9PHH%↓↓α↓↓↓αε∨∃↓~iET4P0$$J↓↓α7∞≠3'OααK↔≠/∪↔;∂*α7π;.04(hP4+K/#WK9π#=↓β&{Aβ3/3↔11π##∃↓αSKO↔"kSKπαβWO↔∩β';S/∪KWC"↓β'Mπ≠'∨;∞c3↔⊃r↓↓αSFKMβW≡+H4+NsS↔K↔+CQβO→β';O#'π3gH'¬β∨KOS↔jkOWCεc'↔⊃ε∪K↔πZβ3??α↓β←#N≠!βπfc?←Mπ##∀'/≠↔Iβ&x4+↔F7'≠*βS#∃π3π3W/→↓β?2β[πKN3↔~β↔≠␈∪∃βSF)↓βNs∪';?→βπK*βK↔O&{K↔⊃bβ'8'F{C∃β}04+≠Ns∪';:βS#∃ε≠πWO*β?→β&C∃β↔↔∪?I9αα'9↓BSKO↔"βQ%βn{∪∃β
βK↔∞Yβ3?␈↓β'Mε+;S↔⊗+⊃1β↔+P4+Nq↓!+↔≠↔QβvK1%βn{∪∃↓π##∃β/≠↔IβNsS↔K↔+CQβO→β'∨v{K↔⊃r↓↓α'2βS#∃ε+KK?∩β'M↓ε;?';:βS<4W∪↔SW⊗qβS=ε βK.-β?∩βπ9β/∪KO↔"aβπ;"↓+KO/!β'Mεs?97vK11β&C∃β↔↔∪O↔Qπ+O↔IεK;S↔↔∪WCPhS'M↓π≠'∨;∞c3↔⊃pIαS#*↓β';O#'π1αβ↔;[O∪?;7.sQβ∂}sSπ'w→↓β∧NsW31αβ#π;&c↔I↓ε3?Iβ&C'L4VK;S↔↔∪WCQbβWQπ##∃β/≠↔IβneβO/βC3eε βK.-β3}{Aβ?∩β?S#/⊃β#πv#3↔Iph(4)α↓α∂?↔∪↔∂S∞∪3∃β/∪K?K~βπK∃ε+KK?↔→↓β←FK∂!βneβ*β∂?K⊗+∂S↔"βe↓π+O↔IεK;S↔↔3↔;SN{984TK→βO.≠!βπrβ↔KK␈⊃β'MπβK?C/∪3eβ≡{KK↔∨#↔⊃1ε+[π3.S'?rβ←'3bβCK?≡+↔⊃β∂→β'→αβ;=β/∪K?HhS#π⊃ε{∂∂W↔∪↔⊃9αα'→β&C∃β?π#'?9π#=↓β≡{KK↔∨!βS#*β↔KK␈⊃β'Mεs?Qβ/C↔K∂O≠↔⊃1αβS#'~βSgC(h+?→ε+KK?∩β←'3bβ∃βF;∪3.!βπMεK→β'"β←↔K*βπ9β.s∂?K⊗+∂Sπ⊗c∃β↔↔∪?I8hP4)↓αα←#↔rβ¬β∂␈∪K↔∂&3∃ε+KK?∩β?∂∂/∪M1β
βWO↔∩β';S/∪KWC"β'Mβ≡K∨;πfc↔⊃9ααO↔∃πβπ∨∃β→44)I↓β≠␈⊃↓βW≡+Iβ'w#↔KK/βQ↓β≡Cπ;;.a↓βπ∨≠'∨;n+;SMε3?I↓π##↔O*↓β↔K⊗{KM9α↓αS#*β';'&Kπ04V+;['⊗{;7↔w!β∂?w#π';~↓β#πv#3↔K~β≠?IαβS#↔≡)β↔K⊗{KMβ>C'∂ OβK';"βπ9↓ε+KK?∩β7↔O≡∨∀4W≠'7'fIβSz↓βS#*β7↔O≡∨∃↓πβK';&+⊃β≠␈⊃βπ9cribing the error. See section 1.4.2 for details. If the user interrupt
handler is nil, or if it returns a non-list, the error is treated as an
uncorrectable error. But if the handler returns a list, the first element of
that list is used to correct the error in a way which depends on the particular
error which occurred.
If the most recent error-catcher is not top-level, correctable errors will
be treated as uncorrectable errors unless there is a non-null handler for the
errset interrupt. This is to prevent confusing "multiply nested" error breaks
unless the user indicates that he is sophisticated by setting up a handler for
the errset interrupt. (The errset handler itself is only invoked if *rset is
non-nil, however.)
See the functions error, err, and errset.
1.4.2 User Interrupts
LISP provides a number of "user interrupts," which are a mechanism by which
a user procedure may temporarily gain control when an exceptional condition
Page 3-16 ∪3-1.4.1 March 3, 1979
The System
happens. The exceptional conditions that use the user interrupt system include
certain control characters, the alarmclock timers, asynchronous I/O conditions,
the garbage collector, and many of the errors that are detected by the
interpreter or by the system functions. Errors detected by user functions can
use this mechanism also.
The user interrupts are divided up into several channels. Each channel has
associated with it a service function. If the service function is nil,
interrupts on that channel will be ignored. If the service function is not
nil, it is a function which is called with one argument when the user-interrupt
occurs. (A few interrupt handlers take more than one argument. See the
specific descriptions.) The nature of the argument depends on which channel the
interrupt is on; usually it is an S-expression which can be used to localize
the cause of the interrupt. Some user interrupts use the value returned by the
service function to decide what to do about the cause of the interrupt.
Interrupts can be either synchronous (e.g. errors and garbage collector
interrupts) or asynchronous (control characters, alarmclock, etc.). To prevent
timing errors, asynchronous interrupts are always run in (nointerrupt t) mode.
A handler for an asynchronous interrupt must explicitly do (nointerrupt nil) to
permit other asynchronous errors to interrupt it. (For example, the system-
supplied ↑b handler does this so that control character interrupts can be used
within the ↑b break loop.)
The service functions for most user interrupts are kept as the values of
symbols with mnemonic names. A list of these symbols begins on page 3-19.
There are also user interrupts for control characters. The service functions
for these are declared using (sstatus ttyint). See page 3-78.
The initial values for the service functions of the various interrupts are
provided by the system as break loops for some interrupts and nil for others
(except for some control characters).
There are some special considerations for user interrupts signalled by
correctable error conditions. The argument to the service function is a
description of the error whose exact form is described in the catalogue at the
end of this section. If the service function returns nil (or any other atom),
the normal error procedure occurs -- control returns to the most recent errset,
or to top level if there was no errset. If the service function returns a
list, the first element of the list is used to attempt recovery from the error.
The exact way that it is used is described in the catalogue. If recovery is
successful execution proceeds from the point where the error occurred. If
recovery is unsuccessful another error is signalled.
March 3, 1979 ∪3-1.4.2 Page 3-17
Maclisp Reference Manual
Here is an example of a user interrupt service function. This is the one
supplied by the system for unbound variable errors when the user does not
specify one. Note that the system-supplied error service functions
consistently bind args to the argument supplied. The user can check the value
of this variable to see what is wrong. Note too that the system-supplied error
handlers restore readtable and obarray before breaking.
(defun +internal-ubv-break (args)
(declare (special args))
(errprint nil msgfileq) ;print error message
((lAmbda (readtable kbarray)
(nointerrupt nil)
(breac unbnd-vrbd))
(get 'readtable 'array)
(get 'obarray 'array)))
(setq unbnd-vrbl '+interjal-ubv-break)
¬
adarmcloci SUBR 2 args
alarmclock is a function fo@HAG←]QeGYY%]NAi%[Cef8@A∪h↓GC\AMiCeh↓C]HAMi←`~(@@@@↓ig↑AMKaCE¬iJ@AQS[KeLvA←]∀ASf@↓BAeK¬X[iS5JAiS5Kd@@!oQSG AG←k9if@AMKG←]⊃fA←L4∀@@@AKYCAgKHAQS[JR↓C]HAQQJA←QQKdA%bABA
aj[i%[BAi%[Cd@!oQSG AG←k9ifA[%Ge←g∃G←]IL~∀@@@A←L↓[CGQ%]JAeU\@Ai%[JR\A)QJ↓MSegP∪CeOU[K]h↓i↑AC1Ce[G1←GV∪%]ISG¬iKfA]QSGP4∀@@@AiS[∃dASf↓EKS]≤AeKM∃eeKH↓i↑t@↓ShA[¬rAEJ↓iQJA¬i←ZAQS[JAQ↑AS]⊃SGCi∀AiQJ↓eKCX4~∀@@@AiS5JAiS5KdA←HAiQJ↓Ci←Z↓ek]i%[JAi<AS]I%GCiJ↓iQJA
aj[i%[JAi%[Kd\4∀~∀∪QQJAg∃G←]H↓CeOk5K]hAQ↑ACY¬e[GY=GVAG=]ie←1fAoQ¬hASf↓I←]J↓iVAi!JAgK1KGiK⊂~∀@@@AiS5Kd\@↓∪L@A%hASf↓B@A]=\[]K≥CiSm∀A]k[ Kd@Q→Sq]k4@A←d↓MY←]UZRAi!J@Ai%[KdA%f~∀@@@AgQCeiK⊂\@A)!kfAS_A\ASLABAa=gSiSYJAMSa]kZA=`AMY=]kZX↓KmCYUCiS]≤@QCY¬e[GY=GV~∀@@@@≥iS[J↓\RAg∃ifAi!JAeK¬X[iS5JAiS5KdAi<AO↑A=MLARαqβ9β≡+∂?;'→0'πv!↓#πfK7∂f{∂,4R↓↓↓↓α;KWnM⊗n*
a∩π≡↑N2π&Tε∨πU↑FNnT
FNn↑ απ&tvzε|hbεNd
bεn≤>&␈≡X8ml≤kB$ 9H≥
#"H∧∧λλ∃
≥9<H∞|<h_-NY89∂∀≤Y0↔≠4p∞g↓iQJA=QHAg∃i`∪'v9β'Mεc?OQp∧α¬&∞↑2ε∂Dλλ-o(⊃z.l;H∃
≥9#"D∧λλλ\8z∞M990→λ1pw≠w6<P_2P9:[54w3H⊂37@2 one alabm, buPAiQJ↓ag↑AQS[KeL∪GC\↓`G8hQ↓↓↓αβGπ↔.cCπlXn↑{≡+AQ@εE∧∩pε the se@
←]HA¬aOk[∃]`@Aβ#=βπdKπ∂d¬v≡X≥≡2ε@Yqα,∀≤≠tm≡~=Y$∧≠];,,<Kλ∞M→#"D∧λλλ∞M990→λ4yP)Z8z /d¬LX@) or (alarmclock p -1) shuts off
the x timer.
alarmclock returns t if it Starts a timar, nil if it shuts it Off.
Page 3-18 ∪3-1.4.2 March 3, 1979
The System
When a timer goes off, the alarmclock user interrupt occurs. The
service function is run in (nointerrupt t) mode so that it will not be
interrupted while it is performing its service. If it wants to allow
interrupts, other timers, etc. it can evaluate (nointerrupt nil). In any
case the status of the nointerrupt flag will be restored when the service
function returns. The argument passed to the user interrupt service
function is the atom time or the atom runtime, depending on which timer
went off. See also the function nointerrupt.
nointerrupt SUBR 1 arg
(nointerrupt t) shuts off LISP interrupts. This prevents alarmclock
timers from going off and prevents the use of control characters such as
CTRL/g and CTRL/b. Any of these interrupts that occur are simply saved.
(nointerrupt t) mode is used to protect critical code in large subsystems
written in LISP. A similar deferral technique is used by the LISP system
itself to protect against interrupts in the garbage collector.
(nointerrupt 'tty) prevents control characters (typed on the terminal,
or "tty") from causing interrupts; however, alarmclock interrupts (and
other asynchronous interrupts) are still allowed. Any non-tty
asynchronous interrupts which were saved will now go off.
(nointerrupt nil) turns interrupts back on. Any interrupts which were
saved will now get processed. This is the normal, initial state.
The result returned from nointerrupt is the previous interrupt status -
nil, t, or tty.
Example:
((lambda (oldstatus)
<protected code>
(nointerrupt oldstatus))
(nointerrupt t))
1.4.3 Catalogue of User Interrupt Channels
March 3, 1979 ∪3-1.4.2 Page 3-19
Maclisp Reference Manual
Each user interrupt channel (except some associated with files) has a
variable whose value is a functional form, the service function for that
channel. The name of the interrupt channel is the same as the name of the
variable. The following lists the user interrupt channels in alphabetical
order. The argument to which the service function is applied and the value
which it should return are described. By convention, almost all service
functions receive one argument. Some user interrupts are initially set to a
system-supplied handler which binds the variable args to this argument and
enters a break loop. The name of the interrupt is used as the break identifer.
Some user interrupts ignore the value returned by the service function,
while others distinguish two cases. If the value is atomic, the service
function was not able to recover from the condition that caused the interrupt.
LISP will take its default action, such as returning control to the most recent
errset. If the value is a list, the car of that list is used to recover from
the condition that caused the interrupt. It is usually a new piece of data to
be used in place of the one that was being complAined about, or a new form to
be evaluated in place of the form that erred.
If the value of the service-function variable is nil instead of a functional
form, the user interrupt is considered to be turned off. The system behaves as
if the function had run and returned nil.
Some user interrupts are asynchronous in nature, and are executed in
(nointerrupt t) mode to prevent timing errors. The interrupt handler may
choose to run in (nointerrupt nil) mode, however, as the initial ↑b handler
does. The nointerrupt mode is restored after the handler is run. Such
interrupts are themselves deferred by (nointerrupt t) mode.
alarmclock VARIABLE
The value of alarmclock is the service function for the user interrupt
signalled when a timer set up by the alarmclock function goes off. The
argument is the name of the timer which went off, time or runtime. The
returned value is ignored. The service function is executed in (nointerrupt t)
mode. This interrupt is initially turned off,
autoload VARIABLE
The value of autolkad is the service fqnction for the user interrupt which
provides automatic loading of program paciages into the environment.A)QJ4∀~∀~)!COJfZd`$∩∩@@&fZb8h\f∩$∩@@A5CeGPfX@bdnr~∀_∩∩∩$@A)Q∀A'sgQKZ~∀4∀~∃CIOk[K9h@ASL@@QMU]GiS=\[]C5J@@\ACki=YP∨π"kCK?+CCeJq↓↓α&C∃↓β⊗+SGKv+⊃↓β63G∃αβ'L4TK∨;?⊗+⊃9↓¬≠↔∃↓πβπ∂∃β→5IYαβ∪∂I∧∧F/&≥≥G
P~MεO~∧
⊗w&↑.'/πD ↔4λ~;M≡~8;
N(≤q.Dλ≥≠d!"P∪≥w1z4[w⊂;t~qt⊂9Zvx6 9 loads a @→SYJ\4∀∩∧~)GYR[5KggC≥J∩@@A-β%%β¬→
4⊂~¬)!JAmC1k@∃β|1β∂3Jk7π∂≡∨¬β≡+CKπ≡)β#πv#3↔I∧3?Iβ&C∃βW≤+Aβ'w#↔KK/βQ↓β≡K⊂≡v≥MF."∞⎇ε.pQ(⊗v␈MWαε-|"εF≡4εNwLZ'↔∂∞LV"πMR∧d~:ααε-|"π6≤∀π&FTλ4dJLW6N<Ubα¬MRαε≡,w.n]nBεO1Q&vNDλλ-lλ≥~T≤Y=∞↑[Y9∧∧≥X;∞\(~<d
9{[n,9H∧λ(≥<l↑Hλ~≥Y≠→.⊂4yP→|82q]2r⊂:≠P⊂7x→w⊂0FB34v2H7w⊂:~2P!f⊂P⊂22]4qrP_w2⊂9→pr⊂:~2P6r\ypsrH⊂397[P:42H7z42\⊂57q⊂⊂⊂*~2P9r\;4qrCE3:w_z4wwλ4yP9≥w⊂⊂4[⊂∀77Zw:2y≤:x:⊂≥∀P6wY2W⊂⊂λ*44yH4w:2\9:x:λ4yP⊂~w4z4Xv6<P≥:y72YεE7s→↔⊂⊂!]y92w≥6<V⊂~z⊂2|~yz9P≠w6<P~w⊂:4→P$j)H'2{t[P4vx≠2vrw≥0z4w[↔εEεB VARIABLE
The value of errset is the service function for the user interrupt which is
signalled when an error is caught by an errset and *rset is non-nil. The
argument is nil and the returned value is ignored. This user interrupt is
initially off. Turning it on affects the behavior of the error system (see
page 3-16).
fail-act VARIABLE
The value of fail-act is the service function for the user interrupt which is
signalled when any of a large variety of miscellaneous error conditions occurs.
The argument is a list whose first element is generally a symbol which
describes the type of error condition. The rest of the list contains various
objects related to the error. The returned value depends on the error. These
are not standardized and will not be described here. This interrupt is
initially set to a break loop.
gc-daemon VARIABLE
The value of gc-daemon is the service function for the user interrupt which is
signalled after each garbage collection. The argument is a list of items; in
the PDP-10 implementation each item is of the form (space-name free-before
free-after size-before size-after) and in the Multics implementation, each item
is of the form (space-name free-before . free-after). The returned value is
ignored. This interrupt is initially turned off.
March 3, 1979 ∪3-1.4.3 Page 3-21
Maclisp Reference Manual
gc-lossage VARIABLE
The value of gc-lossaga is the sarvice function foR the userinterrqpt which is
sagnalled when there iS no more available address space or when the Time
λSharing Monitor rejectq a requast fkr more meMory. In the MulTics
impl@∃[C@;&S'?paβS#/∪∃↓βO→βπ3>gM↓ε+;/W>Aβ7↔n{Ce1¬≠=↓β&C'Mβ/≠↔H'NsS↔K↔+CQβv+[↔HhS?∂∂/∪E9↓∧K9↓β&C∃αB%↓5EAεK7C3.k↔;S∂#'?8O##∃β∂∪∨W7,sQβ'~↓βS#*β;π7*β?→↓π##∃β∨βπ∂∀hSS#π β3?O"aβπ;"βS#∃π∪↔SW⊗s↔⊃β63W∃εKEβ'>s?K↔ q↓αSFKMβ'w#↔KK/βQβ'~↓β';O#'π3gIβO↔ h+S=ε βK.-β3}{A84Ph(4+>→7?[/∪≠3?8I↓↓↓¬2εJ&∩2∀4Ph*S#*β[π3.)β?→ε;
7?6+K≠3␈9β'MαβS#∃π≠↔K[N≠∃β≠.s∂S'}qβ≠?∩βS#∃π+O↔HNK;S↔↔∪WCQπ;#'∂@h+'Mπ≠'∨;∞c3↔⊃π;#↔9ε βOC∞≠∃β?6+K≠3␈;Mβ''→β∨∂na8%G≠↔∃β∞c3/
ε;⊃↓G≠SπS,ε2ε>=\↔BJe⊃PU&Tε∂⊗}]V.wD ↔
πMRαεl≥V*ε|dπ&FT∞7ε∞<Ubαα
Mε*π,↑G/⊗l\Bπ6≥NV*ε≡4αεN⎇mw⊗.Edα¬&
≡0hV≥nF/↔.↑π"ε≡4εNv≡M⊗∞fO∀π≡/D∞Fzε∀'⊗.≥4εf}}¬`hPQ!PVNu]F␈∨<≤v(J∧∧α¬4~)∀∀HQPPh*Mε*πl≥G.*
|bεNu]F␈∨<≤v*ε≡4π&FT∞6/↔m≤6*εn]f∨&≥⎇bε6}$π&FT∞W≡/$
⊗w&↑.'/πD∞vFN=∧εO_Q.6N>l≥Ff.D∞vF.d∞FF*∧ ∩|z∞?↔∨&]Pε.v=}Vw&↑.2ε∞d∧ε/↔-}"αFm}"ε/≥WεfUDε
αm⊗f*∞⎇εN≡↓Q'>∂4&.Nltε␈ε]lV"α∞|↔~εm}Bε6}]f"Jd∧¬&FQ≤↔⊗?]\Vw"
≡2ε
M↔∨"∧
v2πMRεv≥\Rαε|dπ&FQQ&7∞l>FN}d∞vFN=↓⊗/↔,\Bε∞lDεO'4∧ε∂⊗}]V.wN5Bπ>
≤6Bε\∨∩αε≡f*ε,\VpO>L⊗v&≡,FOV\Dε␈⊂Q-w&F↑.vO≡T∞ε∂↔M≤⊗fg∀FN>↑>F."d∧¬&FT∞&/'↑-f."∞l⊗g.T
↔~ε∀
FO∨D
v2ε∀
f/:mw⊗j∞Mrε⊗QQ&/6≥NV∂&\DεNr∞
F∞≡T
v2πMRε≡≥MBπ&t∞FF*nVv∨M≥vrπ⎇
⊗≡B↑'⊗.Edα¬&
≡2αε≥nF/↔.↑π"ε≡1PVNm≡FN∞MO∩π≡↑Dπ&z∀ε↔⊗\≥2εf⎇}αph!Q hV\≤6FNlUV/↔-} Jα∧∧¬4
)_∀∀dQQ hUMRαπl≥G.*
|bαε\≤6FNlUV/↔-}"αε≡4π&FT∧π≡/.m⊗≡*∧
ε∞vMLW∩εm}"απMRαπ↑<W∩ε≥nF/↔.↑π h.=⊗>v≥MF."∞⎇ε.r∞=vn*M⊗66≤>Vg'∀
↔~ε←∞ε/⊗≤]f≡.D'JπMRεF}>Bεn≤=εNvUdα¬&Tπ≡/.m⊗≡(Q,g.v>M⊗}r∞,V≡.≡lW~εm}W∩ε≡,w.n]nG~ε≥n7&.≤Dε}2
⎇f*r∧
FF*m↔↔∨D
↔~ε≥dε∂&⎇]⊗~π?≥V⊗}AQ&NvM≤6∂&≥lrπ&Tπ'OTε}2↑'⊗␈'!PPh$∧αε/l≥@HJ∧∧αεNMLV>∞D
V∞≡
≥f*ε}W⊗∂M≥vph$∧αε/≥VNvQ∀ααα≡G&.↑∞Bπ&t∞&.6↑,Vv≡T
f}r\←εO∨L]g"ε\]V␈↔⊃Q"ααLWε␈=≡@Jα∧∧ε∂'L]Wπ"∞Mrπ?-≡F*ε≥nFzπ,\⊗"n⎇mGJε\]V␈↔⊃Q"αα
|F'⊃∀ααα∞↔⊗OO∀ε/↔-} hUMRε␈MW∩πM∞&.*≡&?.\]g'~≡&*εm∨εw.↑4π>F≤=αε∂,Tε∞εN,W∨≡↑4ε}2∧
V.n}/∩εf|<↔&N⎇n2ph!Q hU≤v*β5V#⊂H⊃∀αα↓65S
sEf0HH∀∧α∧n≡,6Bβ5DβKw⊃PP`H⊃⊃∩α¬MR¬∨≡>F.hQ!PPh*Mε*π<\6}vD
↔~πMRεf|<↔&N⎇dε}2∞Mε*ε↑.&␈∪4∞FF*∞MεO⊗D
↔~πMRππ-|w⊗∞T∧ε≡␈]nF/∩∞⎇ε.pQ.FF*↑'⊗␈$
v≡∨↑.&.#4⊗v"∧∞FF*mw/↔M∧εO~∞Mε*∧*λ0JGMRππ-|w⊗∞T6␈.nLW∩ε≡4αε}d∞FF(Q-F∂∨D
'.o∧∧εNw>N'.∨M≥vrε,\f␈⊗T∞FF*∧W↔⊗}$ε}≡>↑'⊗.E∃bα¬MRαε\≤6FNlUV/↔-}"εF≥lFf/!Q&n∂∀∞6N>l≥Bαε∀FN6l↑&.wD
6NvD∧ε}2↑'⊗␈$
w∩α∀¬v:∞≡VO"∧¬π≡.T∞FF*lrαεn]f∨&≥⎇bJε≤aPV&↑=↔⊗.EDε␈∩∧Vw&↑$ε
ε.,V∞Z∧
F}␈¬dα¬&Q↔∨..$ε7.l>FN}d¬π≡.T∧πε∞|Tβ~k⊗ε∩Jα
\↔Jε,QPW/<\g.b
≥bαεL\6}&≥lrπ&Tπ&G,\Rαεm∨εw.T↔⊗?]\Vw'5dα∧Nd∧π&FT
ε∞vMLW∩α∞,W'/-n2bπMPhWl≥G.*
≡2εN⎇mw⊗.D⊗v"∞Mε*ε↑.&}v]}W~ε}W⊗∂M≥vrε≡4π⊗/N-⊗."d∧∧N2∞Mε*α∞↑6/∩∞∞&␈6≤LW_h-mrεn≤=εNvU\W↔⊗}$εF∞lMF/∩¬∞FF*
≥g&/..Wπ"
≡2εNm≡FN∞MO∩π'↑-f."
|f2JD∞FF*∧W↔⊗}$εO_Q-ε∞vMLV"ε≥dπ&FTF.6≡]G"ε\≥fv/$f␈∩∞Mε*ε
}7"ε\≤6FNlUbα∧⎇d∧M%5Dπ&F≡4ππ/N4π&FT∞W≡/!Q&NrλHE"r∧
FFO47/↔,]g&g∀WFO>N2ε}mO∩εNd∞FF*
λEαk⊗∧∧v/⎇≥rεN↑
F.n]nF∂&≥⎇bph(←ε∞o
LSPh!Q"αα¬F.7]dεn∞=
⊗v*\↑'⊗␈%]ε∞vMLW∩α∞O↔ε*
Mv~π4εWε5⊃PPJ∧¬αFf≥\&&
¬↔⊗?4∞F/↔∞-∩Hh!⊃∩αα¬F.≡L≡&*α∞>ε.≡≤≥Bε∂,}2π&↑.π⊗J∃⊃PPH∀∧ααGL↑'π⊗∀
W≡>m≥F/~⊃Q HJ∧∧αF≡⎇lBαB↑∩π'≡Rα>←⊗nNlU⊂hP⊃⊃∩αα∞∞&Nv4∧wc](Xd-∀Yh4*¬It∧t|eXUDM:HTu Q!⊂HH∀ T,lz+↔bε↑<v6NL↑2JHQ!⊂HJ¬¬ε/
∞O↔ε*∧|F/ε}=↔"HQ!⊂HJ∧¬ππ⊗≥l2α?G:u∀MHT∧LuIt¬∀,_ET|tK∀∧l,Yz%O`Q!⊂HH∀
W≡>m≥F/~∃⊃PPH⊃∀αBF↑∀π'OTα>/l≥BHh!⊃⊂Jα¬∞π⊗Nl4α?c9→Dd,x→B∧l_9∧LtT u∧-(~DL|oAPPH⊃⊃∩εo<|fNf↑5∩Hh!⊃⊂Jα¬W
πO≡ε*α⎇|F'α⊃Q HH∀∧αGπ-≥f~α␈G4l,Yz%J¬λ~$M%∀λU∃∀z/@hP⊃⊃⊂Jε↑<v6NL↑2JHQ!⊂HJ¬∞BαG∞-⊗v~∧␈C],i9d⎇<d T≤ →d*∧Z*$⎇↔AQ HH⊃∀ααε↑<v6NL↑2JJ⊃Q HJ∧∧αGπ-≥f~α␈D∧5∀yT∧d|8~DL|d∂Bεo<|fNf↑5⊂hP⊃∀ααα∞∞&Nv4∞ε~HQ!⊂Jα∧¬ππ⊗≥l2α?D ∀r∧jYd≥$→ybπb
↑6>6≥LW~HQ!⊂Jα∧¬ππ⊗≥f∩αG>\'∩π5∩Hh!⊃∩αα¬'⊗.≥4εn∞=
⊗v*\↑'⊗␈%∃⊂hP∀∧ααFM≡7"πO≡ε*εM|2πε4
'ε~⊃Q Jα∧∞BJHQ!PPh-\↔∩n.,V∞X∀∧αα¬h~$L)HPhPQ*FF*∞l⊗g.T
v2ε\≡"n↔,\⊗Zε≡4π&FT∞6/↔m≤6*ε≥f&f↑$ε6␈$∞FF*∞↑6/∩∧
⊗w&↑.'/πD∞6N>l≥Ff.AQ hPQ)V∂⊗=∧β~bε↔∪;H⊃⊃∩ααα62k
fEc_H⊃∀ααα∧∧α¬ε≤|Rβ~V&0hP`H⊃∀αα∧\≤6fO>∧¬⊗.l↑&.v<T∧n∞n\⊗`h!Q hW⎇VrπMRεn]]w↔J∧
F}≡≡M⊗}r∞>ε.≡≤m⊗."/∩αG>>F∂' mar) (see page 3-95) has been
accessed in the specified manner. The argument is nil and the returned value
is ignored. The service function is run in (nointerrupt t) mode. Also, LISP
implicitly performs (sstatus mar 0 nil) before running the user interrupt; this
helps to prevent infinite loops. This interrupt is initially turned off. It
currently exists only in the ITS Newio implementation. See page 3-55 for more
information on using this interrupt.
pdl-overflow VARIABLE
The value of pdl-overflow is the service function for the user interrupt which
is signalled when a pushdown list exceeds its pdlmax. (see alloc and (status
pdlmax).) The argument is the spacename of the pushdown list. The returned
value is ignored. This interrupt is iniTially set to abreak loop.
sys-death VARIABLE
The value of sys-death is the service handler for the user interrupt signalled
when the time-sharing system is about to go down, has been revived from that
state, or is being debugged. The argument is nil and the returned value is
ignored. A user handler may wish to examine the result of (status its) to
determife the state of the system. The service function is run in (nointerrupt
t) Mode. This interrupt is initially turned off. This currently exists only
an the ITS Newio implementation.
ttq-return VARIABLE
The value of tty-return is the service handler for the user interrupt signalled
when cOntrol of the terminal is retuRned to the LISP job by itq superior. This
allows LISP to determine that the display screen may have been changedby other
jobs. The argument is nil and the returned value iq ignored. The service
function is run in (nointerrupt t) mode. This interrupt is initially turned
off. This currently exists only in the ITS Newio implementation.
unbnd-vrbl VARIABLE
The value of unbnd-vrbl is the service function for the user interrupt which is
signalled when an attempt is made to evaluate an atomic symbol which does not
Page 3-24 ∪3-1.4.3 March 3, 1979
The System
have a value (an unbound variable.) The argument is a list of the symbol which
could not be evaluated. The returned value is a list of a new symbol to be
evaluated in its place. This interrupt is initially set to a break loop.
undf-fnctn VARIABLE
The value of undf-fnctn is the service function for the user interrupt which is
signalled when an attempt is made to apply an undefined function. The argument
is a list of the functional form which could not be applied. The returned
value is a list of a new functional form to take its place. This interrupt is
initially set to a break loop.
unseen-go-tag VARIABLE
The value of unseen-go-tag is the service function for the user interrupt which
is signalled when go or throw is used with a tag which does not exist in the
current prog body or in any catch, respectively. The argument is a list of the
erroneous tag. The returned value is a list of a new tag to replace it. This
interrupt is initially set to a break loop.
wrng-no-args VARIABLE
The value of wrng-no-args is the service function for the user interrupt which
is signalled when a function is called with the wrong number of arguments. The
argument is a list of two items: First, a list of the function and the
arguments that were passed. Second, the lambda-list if the function was
interpreted, or the same dotted pair as args returns if the function was
compiled, or the atom ? if this information could not be determined. The
returned value is a list of a new form to be evaluated in place of the losing
one. This interrupt is initially set to a break loop.
wrng-type-arg VARIABLE
The value of wrng-type-arg is the service function for the user interrupt which
is signalled when an argument is passed to a system function which is not
acceptable to that function. The argument is a list of the argument which was
not accepted. The returned value is a list of a new argument to replace it.
That is, directly an argument, not a form to be evaluated to get an argument.
This interrupt is initially set to a break loop.
March 3, 1979 ∪3-1.4.3 Page 3-25
Maclisp Reference Manual
*rset-trap VARIABLE
The value of *rset-trap is the service function for the user interrupt which is
signalled when an error returns control tk top level, just before the bindings
are restored. By convention, the handler for this interrupt should not do
anything unless the variable *rset is non-nil. This is so that the user will
not be bothered unless he has put LISP in debugging mode. The argument is nil
afd the retuRned value is ignored. This interrupt iq initially set to a
Function which enters a break loop id *rset is non-nil.
There are other interrupt handlers which are associated with I/O files or
inferior jobs. See eoffn, endpagefn, (sstatus ttyint), and create-job.
1.4.4 Autoload
The autoload feature provides the ability for a function not present in the
environment to be automatically loaded in from a file the first time it is
called. When eval, apply, funcall, or the version of apply used by compiled
LISP searches the property list of an atom looking for a functional property,
and fails to find one, it looks for a property under the indicator autoload,
and it it finds one, automatic loading will occur.
Automatic loading is performed by means of the autoload user interrupt; thus
the user may assert any desired degree of control over it. When the autoload
property is encountered, the user interrupt handler is called with one
argument, which is a dotted pair whose car is the atomic symbol which is the
function being autoload'ed, and whose cdr is the value of the autoload
property. The system-supplied handler for this user interrupt could have been
defined by:
(setq autoload
(function (lambda (x) (load (cdr x)) )))
From this one can see that the value of the autoload property should be the
name of the file which contains the definition of the function. Note: in the
TOPS-10 implementations the system autoload handler presently uses fasload
rather than load because the load function requires the Newio feature. This
affects the form of an autoload property.
When the interrupt handler returns, it should have put a functional property
Page 3-26 ∪3-1.4.3 March 3, 1979
The System
on the property list of the function being autoloaded. If not, an undf-fnctn
error will occur with a message such as "function undefined after autoload."
Examples of setting up functions to be autoloaded:
In the Multics implementation:
(putprop 'foo ">udd>AutoProg>Library>foo-function" 'autoload)
In the PDP-10 Oldio implementation:
(putprop 'foo '(foo fasl dsk me) 'autoload)
In the PDP-10 Newio implementation:
(putprop 'foo '((dsk me) foo) 'autoload)
or (putprop 'foo '|dsk:me;foo fasl| 'autoload) or the Oldio version also
works.
March 3, 1979 ∪3-1.4.4 Page 3-27
Maclisp Reference Manual
1.5 Debugging
1.5.1 Binding, Pdl Pointers, and the Evaluator
The Maclisp evaluator is based on a push down list (pdl), or stack, which
holds bindings, evaluation frames, and sundry internal data. Bindings are
values of atomic symbols which are saved when the symbols are used as lambda
variables, prog variables, or do variables. Evaluation frames are constructed
when a non-atomic form is evaluated or when apply is used. They correspond to
function calls.
As the evaluator recursively evaluates a form, information is pushed onto
the pdl and later popped off. When the *rset and nouuo flags are t this
information is sufficiently detailed to be of use in debugging. (See the
variables *rset and nouuo in the next section.)
A position within the pdl may be named by means of a "pdl pointer", which is
a negative fixnum whose value has meaning to the evaluator. nil is also
accepted as a pdl pointer; it means the top of the stack, i.e. the most recent
evaluation. Note that this is different from nil as a binding context pointer,
which means the bottom of the stack or the outermost evaluation. 0 is also
accepted as a pdl pointer; it designates the frame at the bottom of the stack.
Pdl pointers may be used as arguments to several debugging functions described
in the next section. Since the fixnum value of a pdl pointer has only internal
meaning, generally a pdl pointer cannot be obtained from user input, except by
the user typing in a pdl pointer chosen from a list of pdl pointers typed out
at him. The "frame" functions described in the next section may be used to
obtain pdl pointers.
An important thing to note about pdl pointers is their limited scope of
validity. If the information on the pdl which is named by a pdl pointer has
been popped off since the pdl pointer was created, the pdl pointer no longer
has valid meaning.
1.5.2 Functions for Debugging
Page 3-28 ∪3-1.5 March 3, 1979
The System
*rset SUBR 1 arg
(*rset x) sets the *rset switch to nil if x is nil, or to t if x is
non-nil, and returns the value it set it to. (See below). This function
exists primarily for user typing convenience.
*rset SWITCH
If the *rset switch is non-nil, extra information is kept by the
interpreter to allow the debugging functions, such as baktrace and
evalframe, to work. In addition, the interpreter will make extra checks
such as checking the number of arguments passed to a subr or lsubr and
checking that array subscripts lie within the declared bounds. Generally,
the *bset switch being on means "I am debugging"; this is known as "*rset
mode". The iniTial State of the switch iq nil.
nouuo SUBR 1arg
(nouuo t) sets the nouuo switch∞
(nguUo nil) tuRns off the nguuo switch. (This is the iNitial state.)
nouuo Returns t or nil accOpding to whether it turned the nouuo switch
on or off, (See below.) This function exists primarily for usep typing
convenience.
nouuo SWITCH
If the nouuo switch is on, function calls made by compiled functions to
compiled functions or system functions are forced to go through the
interpreter each time. This aids in debugging. If the nouuo switch is
off, which is the normal case, compiled calls can be made to go directly,
which is much faster.
The nouuo switch may be turned off at any time. Each compiled function
call will only go through the interpreter once more, at which time it will
be linked directly. If the compiled code has been reloaded into the
system with the PURE option (see page 3-71) then this direct link may be
unsnapped and the Interpreter route re-established by (sstatus uuolinks).
March 3, 1979 ∪3-1.5.2 Page 3-29
Maclisp Reference Manual
Because the PURE option requires an amount of extra space and time, it is
not normally on; thus links snapped in code loaded as non-PURE cannot be
unlinked.
The trace package turns this switch on when a function is traced, in
order to ensure that tracing will work even for compiled functions.
Compiled function calls which have been "snapped" to go directly do not
push debugging information in *rset mode and cannot be traced. See also
(status uuolinks).
baktrace LSUBR 0 to 2 args
baktrace displays the stack of pending function calls. It gives
detailed information only in (*rset t) mode. The first argument is a pdl
pointer, as with evalframe. If it is omitted, nil is assumed, which means
start from the top of the pdl. The second argument is the maximum number
of lines to be typed; if it is omitted the entire stack is displayed.
(The second argument is currently permitted only in the Multics
implementation.) The information printed by baktrace is not the same as
that obtained with evalframe; both should be used to get the maximum
amount of debugging information.
baklist LSUBR 0 to 1 arg
baklist returns a list containing the information which baktrace would
print. (This is available only on the PDP-10 implementations.)
errframe SUBR 1 arg
errframe returns a list describing an error which has been stacked up
because of a user interrupt. The list has the form (err pdlptr message
bcp), where pdlptr is a number which describes the location in the pdl of
the error, message is a list of from one to three things which, given to
the error function, could have caused this same error, and bcp (binding
context pointer) is a number which can be used as a second argument to
eval or a third argument to apply to cause evaluation using the bindings
in effect just before the error occurred.
The argument to errframe can be nil, which means to find the error at
Page 3-30 ∪3-1.5.2 March 3, 1979
The System
α the top of The stack: i.e. the most p¬KGK9h@AKIaGd\A∪hA
C\AC1g↑AE∀@AB@AIX~∀@@@AA←S]i∃dXAS8AoQS
PAGCMJAiQ∀@Agi¬GVASLAgKCIGQKHαβ∪?←w;πK⊃ε3C/5αβS#∃∧K;∪'≡S↔⊂hQ↓↓↓αβC?OM#'?9pJS#W~↓β'→¬##↔K*βπK∃αβK↔∂-∪@≡OlTε≡∞MJ2π&q~FF*PN5y⊂⊂~0p∞dler, @QQJ
∀@@@AMKG←]⊂AKee=dAEC
RAI←β;9βSF)βOS∞≠%β7∂Iβ∃∧3?W≠ ∧ε↔K!Q h⊂α"(∧∧λλλ∧¬→<\LNX;9$¬_x9∞⊂⊂2@2pframe nI0RRR~(~(~Mε*ε_Yn]9;]∧∞≠hλ↑\YTL≥9(∪,∨(⊂;∞wP12H⊂0P0ositive number shi
P@ASLAaQJ4⊂@@@AUKO¬iSmJ↓←D@A∧AaIXAa←S9iKd\α↓αS#M→β.\≥g4λ≤p~_y0∀@→`}T∧π&FT
ε␈≡≤M⊗}r∧λ
-d≥~→!PHλλ∧∧≤⎇_,=h≠8.
y1⊂_8P:4→P826λ87tg≥2y⊂!nd sEarchqpwards&
α∪∩α1β+p .93q~yP3']w2⊗⊂→y93)_vrP 2eturnq niL,λ
∀~(~+↔↔∪CKπw %↓↓αα2NV∃⊃↓Eβ&y↓Iα∂∪⊂∨_Q!P@!9<\N∞X;]∧∧≥≤Y,≡≤hλ
≡≤hλ≡Yy ⊗Yw:⊂⊂≥42P⊂≤βa`≠JACF∩α#@↔⊗n,⊗n
d∧α¬&Tαπ≡\0≠mlβ"H∧∧λλ⊂.,⎇;9-n ⊂∀[⊂#2@7io iMphe@[∃]aCI%←\A↑αs3e1∧K@~πMRε6≥HRG~∀~-n≠h≠Z4qt≥0π pRint
the Information (seE print)∞A)QJ↓[@↔O≡∨¬βε{CC'}q↓β?2βS#∃ε+@↔⊗} αε7,≥V*ε≡1PRα∧∧αππ-≥f~>\@A≤<X 8≤4w:⊂≤2z:i≠9P⊂*λ4s⊂0H⊂6ry\psrP≥pyP:≡x2r out and Nil id∧A]↑4∀@@@AKee=dAMe¬[JAo¬fAM←U]H\~(~∀~∃∃mCYMIC[J∩@@A'U¬$@b↓CeN~(~∀β)!JAC⊗;W7↔w!βS=∧+[π∪7∪π7∃εK@~ε∀∞ε&b∞
vNwL↑"bε≡4π>OM∧ε/↔,n&∞nUa∃&FT∞ε&`Q$ααα∧
↔
π<\↔⊗≡\Bαεmz"ε∞dW6∞N\↔&N⎇dαε}d∩ε7]l7&N⎇dαε≡≥MBbπ↑=⊗v:∞Mε*α∞<⊗n*∞.Vf/1Q"αα∧∧ε∞⊗}↑Bπ∨L≡'&Nltαπε⎇≥g"ε≥l@N&≡,V∨&≥⎇bε∂4∧ε/↔,n&∞nT∞W≡/5dααε↑l⊗f7,≥V*ε≥Nv∂O1Q"αα∧∧π≡↑≡∞2ε␈l↑"ε∞o∀ε≡∞MN2π&t
↔'≡]Lbπ&≡BεODfNvN4εNr∞Mε*πMBph!Q M&Tπ6∞N\Rαε≡4ε
α
M↔∨"¬∞GOεT∧πε&N∞G∩εm}&jα,7αJD∞vF/,Tαπ'≡RεO1≤W6∞D
w⊂h$∧ααα≡πεg∃Dπε&N∞G∩ε≡4αε
∞Fbπ
⎇⊗w&↑$π&z∧∞FF*↑f∞g\≡FN}d
⊗rπMPO∨L≤6Zb∞>VO&≤-F(h$∧αααmw∩π↑<Rε∂4⊗rε≡,w.n]nBπ&q≤W6∞Ln&∞nT
w∩ε↑.&7⊗≥\Rε␈$&∞←N,⊗≡*Df␈⊗T∧εO~∞Mε(h$∧αααmw⊗j,VNvtW6∞N\↔&.D
w∩ε∀
FO∨D∧ε}2∞Mε*εl≥V*ε|dπ&FTg.v>M⊗}r∧&.Nltε∂π
M⊗. Q$ααα∧⊗v"∞Mε*ε≡,w.n]nG~ε≡Dπ>∂4↔πεM≤V"πMuBε∞lDε⊗∨∧
↔~ε∀&NvM≥f8N=⎇g&/∞Dπε}≥nF/⊂Q$ααα∧∞vFN=∧ε≡∞d&*π↑<V"π⎇≡FBα↑f∞b∞Mrε/l≥G.∂LTπ≡}\↑FFNltεNr∞Mε(N-≥f&Nltε≡}nLWG Q$ααα∧
'/∨D&.6},Rπ&Tε/6≥NV∂&≥⎇bε6}]f"ε/∀ε/6≥Lg⊗∞\U`hPQ!⊗/6≥Lg⊗∞\Tπ⊗/N↑&w~
m⊗bε≤dεvz↑f∞g\≡FN}d6∞r,Rε6}]f"pQ!PPN↑l⊗f7,≥V*α
⎇fgJ∧∞v␈⊗>1⊗Nr∧¬αW↔<↑BαπE⊃⊗n}LUBαπ=≥f≡*∧
fzα∧WG',∀αε7,≥V(h$∧ααα
≥f6␈-\↔&N⎇dεO~∞<↔6.D
w&F↑.vO≡UaPPh!Q$n∂,=αβ~Dε∪K;⊃⊃⊂Jα∧α3~k∃fRs⊂⊃⊃∩αα∧∧αα¬≤v*β5V3λh `H2 args
(freturn p x) returns control to the evaluation designated by the pdl
pointer p, and forces it to return x. This "non-local-goto" function can
be used to do fancy recovery from errors.
evalhook VARIABLE
If the value of evalhook is non-null, then special things happen in the
evaluator. When a form (even an atom) is to be evaluated, evalhook is
bound to nil and the functional form which was its value is applied to one
argument - the form that was trying to be evaluated. The value it returns
is then returned from the evaluator. This feature is used by the Stepper
package described later in this section.
evalhook is bound to nil by break, and setq'ed to nil by errors that go
back to top level and print *. This provides the ability to escape from
this mode if something bad happens.
In order not to impair the efficiency of the LISP interpreter, several
restrictions are imposed on evalhook. It only applies to evaluation -
whether in a read-eval-print loop, internally in evaluating arguments in
forms, or by explicit use of the function eval. It does not have any
effect on compiled function references, on use of the function apply, or
on the "mapping" functions. Also, as a special case, the array reference
which is the first argument to store is never seen by the evalhook
function; however, the subexpressions of the array reference (the indices)
will be seen. (This special treatment avoids a problem with the way store
works.) Normally the evaluator does not check the value of evalhook, in
order to save time. To make it check, you must both be in (*rset t) -
debugging - mode, and have done (sstatus evalhook t). Not all
implementations need both of those, but you should always do both to be
sure. If you use the Stepper package, you need not worry; it does this
automatically.
evalhook LSUBR 2 or 3 args
(evalhook form hook) is a function which helps exploit the evalhook
feature. The form is evaluated with evalhook lambda-bound to the
functional form hook. The checking of evalhook is bypassed in the
Page 3-32 ∪3-1.5.2 March 3, 1979
The System
evaluation of form itself, but not in any subsidiary evaluations, for
instance of arguments in the form. This is like a "one-instruction
proceed" in a machine-language debugger. If all three arguments are
present, the second is a binding context pointer and is used as the second
argument to eval, and the third argument is the hook.
Example:
(defun hook fexpr (x) ;called as (hook <form>)
((lambda (*rset)
(prog2 (sstatus evalhook t)
;magic sstatus
(evalhook (car x) 'hook-function)
;evaluate form
(sstatus evalhook nil)))
;more magic
t))
(defun hook-function (f)
((lambda (terpri)
(declare (special terpri))
(princ '|form: | msgfiles)
(prin1 f msgfiles)
((lambda (v)
(terpri msgfiles)
(princ '|value: | msgfiles)
(prin1 v msgfiles)
v)
(evalhook f 'hook-function)))
t))
;this is how to eval the
; form so as to hook
; sub-forms
The following output might be seen from (hook (cons (car '(a . b)) 'c):
form: (cons (car (quote (a . b))) (quote c))
form: (car (quote (a . b)))
form: (quote (a . b))
value: (a . b)
value: a
March 3, 1979 ∪3-1.5.2 Page 3-33
Maclisp Reference Manual
form: (quote c)
value: c
value: (a . c)
(a . c)
The following functions only exist in the Multics implementation.
baktrace1 LSUBR 0 to 2 args
baktrace1 is the same as baktrace except that binding context pointers
suitable for use with eval and apply are displayed along with the function
names.
baktrace2 LSUBR 0 to 2 args
baktrace2 is the same as baktrace1 except that pdl pointers, suitable
for use with baktrace and evalframe, are displayed along with the function
names and binding context pointers.
Page 3-34 ∪3-1.5.2 March 3, 1979
The System
1.5.3 The Trace Package
The LISP trace package provides the ability to perform various actions at
the time a function is called and at the time it returns. This can be used for
traditional tracing or for more sophisticated debugging actions.
The trace package is not part of the initial environment; however, it is
automatically loaded in on the first reference to the function trace. (See
autoload.)
The LISP trace package consists of three main functions, trace, untrace, and
remtrace, all of which are fexprs.
A call to trace has the following form:
(prace trace←specs)
A trace←spec in turn is either an atom (the name of the function to be traced)
or a list:
(funcTion-name option1 option2 ...)
where the options are as follows:
break pred causes a break after printing the entry tpace (if any) but
before applying the traced function to its arguments, if and
only if pred evaluates to non-nil.
cond pred causes tpace information to be printed for function entry
and/or exit if and only if pred evaluates to non-niL.
wherein fn cauSes the function to be traced only when called from the
specified function fn. The user can give several trace specs
to trace, all specifying the same function but with different
wherein options, so that the function is traced in different
ways when called from different functions. Note that if fn is
already being traced itself, the wherein option probably will
not work as desired. (Then again, it might.) Note that fn may
not be a compiled function.
argpdl pdl specifies an atom pdl whose value tpace initially sets to nil.
A list of the current recursion level for the function, the
function's name, and a list of the arguments is cons'ed onto
March 3, 1979 ∪3-1.5.3 Page 3-35
Maclisp Reference Manual
the pdl when the function is entered, and cdr'ed back off when
the function is exited. The pdl can be inspected from a
breakpoint, for example, and used to determine the very recent
history of the function. This option can be used with or
without printed trace output. Each function can be given its
own pdl, or one pdl may serve several functions.
entry list specifies a list of arbitrary S-expressions whose values are to
be printed along with the usual entry-trace. The list of
resultant values, when printed, is preceded by a \\ to separate
it from the other information.
exit list similar to entry, but specifies expressions whose values are
printed with the exit-trace. Again, the list of values printed
is preceded by \\.
arg specify that the function's arguments, resultant value, both,
value or neither are to be traced. If not specified, the default is
both both. Any "options" following one of these four are assumed to
nil be arbitrary S-expressions whose values are to be printed on
both entry and exit to the function. However, if arg is
specified, the values are printed only on entry, and if value,
only on exit. Note that since arg, value, both, and nil
swallow all following expressions for this purpose, whichever
one is used should be the last option specified. Any such
values printed will be preceded by a // and will follow any
values specified by entry or exit options.
If the variable arglist is used in any of the expressions given for the
cond, break, entry, or exit options, or after the arg, value, both, or nil
option, when those expressions are evaluated the value of arglist will
effectively be a list of the arguments given to the traced function. Thus
(trace (foo break (null (car arglist))))
would cause a break in foo if and only if the first argument to foo is nil.
Similarly, the variable fnvalue will effectively be the resulting value of
the traced function. For obvious reasons, this should only be used with the
exit option.
The trace specifications may be "factored." For example,
Page 3-36 ∪3-1.5.3 March 3, 1979
The System
(trace ((foo bar) wherein baz value))
is equivalent to
(trace (foo wherein baz value) (bar wherein baz value))
All output printed by trace can be ground into an indented, readable format,
by simply setting the variable sprinter to t. Setting sprinter to nil changes
the output back to use the ordinary print function, which is faster and uses
less storage but is less readable for large list structures.
Examples of the use of trace:
(1) To trace function foo, printing both arguments on entry and result on
exit:
(trace foo)
or (trace (foo)) or (trace (foo both)).
(2) To trace function foo only when called from function bar, and then
only if (cdr x) is nil:
(trace (foo wherein bar cond (null (cdr x))))
or (trace (foo cond (null (cdr x)) wherein bar))
As this example shows, the order of the options makes no difference, except
for arg, value, both, or nil, which must be last.
(3) To trace function quux, printing the resultant value on exiting but
no arguments on entry, printing the value of (car x) on entry, of foo1,
foo2, and (foo3 bar) on exit, and of zxcvbnm and (qwerty shrdlu) on both
entry and exit:
(prace (quux entry ((car x)) exit (foo1 doo2 (foo3 bar )
both zxcvbnm qwerty shrdlu)))
(4) Do trace fUnction foo only when calledby functions bar and baz,
printingargs on entry and resulton eXit, AeS]i%]NAi!JAmC1k@∃β|1↓↓#∂+Waβ⊗K_4R↓↓β∂∪C!%∧{9β↔FKQβ≠⊗{5β≠|yβ←#.qβ∂πfc↔⊃β↔IβπRβ?;3Jaβπ≠"↓β∂?v#'S'}sπ33JβK↔∞[';≤hQ↓↓β>C↔9β≤∧⊗fF\@ε↔J,↔∩ε≤dε
ε↑≡V∞g4#Ph!Q hPQ)V∂⊗=∧β~bε↔∪;H⊃⊃∩ααα62k
fUc_H⊃∀ααα∧∧α¬ε≤|Rβ~V6phP`H⊃∀αα∧\≤6fO>∧¬⊗.l↑&.v<T∧n∞n\⊗`HαC"APA"B∧∧λλλ∧∧
≥≤L≤y(
m{h∃m<Y2-d_X<D\Y8-4λ→0_]pv⊂! b))
(foo wherein baz exit ((quux barf barph))))
(5) To tpace dqfcTions phoo afD`¬bXA9KmKd↓aeS]QS]NA¬]siQ%]N@A→←dAK%iQKd0~∀@@↓Ech∪MCmC]≤∪CYX↓CeOjαk↔;S~↓β≠?⊂↓β≡αMαε}d∧ελ∞=x-]{H≤Mλλ⊂l≥≠→1∧∧→[`↔\26⊗⊂_w2εEλ⊂⊂19→pqt@ne insi`e phoo Id∧A`A%`
β;L¬C@"C"A∀λλλ∧∧λ
≥∞0qrP
847gλ0y3x→4⊂3/opdl break (nulh p) condnid 9SXB~(∩∩@@@@@Q→jAC↓⊗;C∪1∧3??C&aβ∂?t!βπbβ;'⊂J@4(Q$ααα∧∧¬&FT∧&≡}l@λ
m8ε⊃ prev@∃]afA¬]siQ%]N∪CPAC@3bβ∪K∨hβ↔'v9βCKLsS↔⊃p↓↓αSF)βO↔_¬vv Q$ααεm→BεNdλV∞≡∧
G,8y(∧∞|→0⊃λ9x2aZq0riH840zλ70∂Args or valpJA¬eJAi<@AEJ↓aeC]QKHv~(@@AC1iQ←K≥PAiQ∀AG←]⊂AUCX↓o←kY⊂AaeKspecifying this too
prevents trace from even setting up the mechanisms to do this.
trace returns as its value a list of names of all functions traced; for
any functions traced with the wherein option, say (trace (foo wherein bar)),
instead of returning just foo it returns a 3-list (foo wherein bar). If
trace finds a trace spec it doesn't like, instead of the function's name it
returns a list whose car is ? and whose cdr is an error message. The error
messages are:
(? wherein foo) trace couldn't find an expr, fexpr, or macro property for the
function specified by the wherein option.
(? argpdl foo) The item following the argpdl option was not a non-nil atomic
symbol.
(? foo not function) Indicates that the function specified to be traced was
non-atomic, or had no functional property. (Valid functional
properties are expr, fexpr, subr, fsubr, lsubr, and macro.)
(? foo) foo is not a valid option.
Thus a use of trace such as
(trace (foo wherein (nil)) (bar argpdl nil))
would return, without setting up any traces,
((? wherein (nil)) (? argpdl nil))
Page 3-38 ∪3-1.5.3 March 3, 1979
The System
If you attempt to specify to trace a function already being traced, trace
calls untrace before setting up the new trace. If an error occurs, causing (?
something) to be returned, the function for which the error occurred may or may
not have been untraced. Beware!
It is possible to call trace with no arguments. (trace) evaluates to a list
of all the functions currently being traced.
untrace is used to undo the effects of trace and restore functions to their
normal, untraced state. The argument to untrace for a given function should be
what trace returned for it; i.e. if trace returned foo, use (untrace foO); if
trace returned (foo wherein bar) use (untrace (foo wherein bar)). untrace will
take multiple specifications, e.g. (untrace foo quux (bar wherein baz) fuphoo).
Calling untrace with no arguments will untrace all functions currently being
traced.
remtrace, oddly enou@≥PX@A∃qak]≥KfAi!J@AK9iSeJ↓ieCG∀@AaC
SCOJ8@A∪hAiCW∃fA]↑4∃CeOU[K]iL\~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~)≠CeG @fX@Drnr∩$∩@@@LfZb\T\f∩∩$@@@@@A!C≥J@fZLr~∀_∩∩∩@A≠C
YSg`↓%KMKIK]GJ↓≠C]k¬X~∀~(~∀b\T\h@AQQJA'QKaaKH~∀~∀4∀@@AQQJ∪→%' @EMiKaa%]ND@↓aCGW¬OJ@A%fAS]QK]IK⊂@Ai↑AOSm∀AiQJA→∪'@@Aae=OeC[5KdAB4∃MCG%YSir↓C]CY=O←kf↓i↑Ai!JA∪]MiekGQS←\@↓'iK`↓[←IJ↓←LAeU]]S]≤AB@A5CGQS9JAYC9OkCO∀~∃ae=OeCZ8~∀~∀$∩∩@@@@@AQQJA%%GPA'QKaaKH~∀~∀@A)Q∀A%SG AgiKAaKdAACGWC≥JAae=mSIKLABAg%[aYJ0Ag[C1XAIK kOOS9N∪GCACESY%ir\@↓∪h~∃%fACm¬SYCE1JACf↓BAYS eCer↓ae←OICZAS8AiQJ↓∪)&A%[aYK5K]iCQS←\\4∀~∃⊃=nAi↑↓+gJAQQJA'Q A
¬GSYSQr~∀~(~∀@@↓)QJAACGWC≥JAG←9iCS]LAio↑↓G←[a%YKHA→k]Gi%←]fA]QSGP↓CeJA1←CIK⊂AEr~(~∀∩∩$QMCg1←CHAMiK`A→CgXA⊃gVAY%EYg`$~∀~∃QQJAkMKdAS9iKeM¬GJASLAiQe=kOPAQQJAMU]GiS=\@QM∃qadR↓giK`0AoQS
PAgKQfAgo%iGQKLAi↑~)akhAQQJ@A1∪' A%]iKeAeKiKHAS\@↓C]HA=khA←_@@EgQKaaS9NDA[=IJ\@↓)QJ@↓ECgSAG←[5C]If4∃CeJh~∀~∀4∀∩@@@@@QMiK`APR∩@@@@@wQke\A=\Agi∃aaS]≤A[←I∀\~∀∩@@@@QgiK@A]SX$@@@@@w)kI\A←M_AgiKAaS]N↓[←IJ8~∀
∃QQKgJ↓G←[[¬]IfA¬eJAkMkCYYdAisa∃HACh↓i←`A1KmKX0AC]H↓oSYX↓iCWJ↓KMMK
hAS[5KISCQKYr~(QR]J8AiQJ↓]Kqh↓&[KqAeKgg%←\AieaKHA%\AoS1XAEJ↓KmCYUCiKH↓S\AgQKaaS9N@A[=IJR\↓βYg↑4∃5NX↓S\AC⊃ISiS=\Ai↑↓eKikβ∪;'≠8∧π&Z∞MwαεLZf.bD∞G/⊗n4ε}6d∞7&/∞
⊗v:
]v&*aQ h∩∧∧∧Nr∞>F/π
→f:ε]xF*b∞Mε*∧I~5αε↑l⊗g∞≡Mw$≥z;
↓⊂894[:⊂7z]⊂2pqZ⊂)Vr↑892i\tp∂n to Be
evaluate` bedkre evalUation, and the retupned↓mC@3,)βπ≠&+A↓β-3π3W∂#'?9bβ∂π3dK;≤4TCSO↔`∧bπ⊗\>W↔≡≡hVgJ∞Mrε&≡:εf∂∀λ
(λ∀nL<≤→,D→=P.]_9~-⎇H≠`∪λ2pqtλ0y3z[rp∞t, if the
S)express@%←\@A%`
↓βλβ↔∞l:FN}d∧ε≡∞MEbααλ≤g&/$
≡|≠⊂⊂↑tp∞G each S ≠JβCCK↔≥≠'?9bβS#∀hS↔[πg+πS?⊂β←'MDπ>∞≤@ε⊗.mpLT→=P-N89~-⎇H→@↔\α a @
←[[C9HAGQ¬`π∂&+Aβ≠⊗{5βSF)β∂?w≠?3∃Ph (!Q"αα∧∧βg∨≤6+p⊃∀∧∞}nM⊗w∞T∞7&/∞λ
-lh≤Y,><Xp∀]2v$WβE
<pqboUt8$JαO#?8βC↔S,ε&v.D
f∞g\Tε.Y{ ∞
~8h
=Y0⊗λ7w6 9, and continue
λ ↓ qteppingUpsa@%⊂X∩∀~(~¬!C≥J@fZP`∩α∩@@&f4b@→Uq $$∧α↓α7π⊗≠!↓Mb↓EE]Hh(0$$HI↓αSF)αOG≥#↔4∀Ph ( ∧αααπH7∪@H≠tDπ≥_8Ga(∃≥.-Hλ≠lLHλ≤nL<≤~-lhλ≠-|→+H∧¬_Y5∧∧_{sNM;]9$∧→=X-N8=~-⎇C"B!⊃(≥z.M≠⎇=∧∞⎇→<∞
;Yb%a"C"D∧λλλ
↓""(
,9~4n
_>(><\Y-nλ→Sn-(~3D];⊂⊗λ∀4W2K⊂;tz~7zz⊂≤94w6→{2vεB∧DDP≠y⊂89~w62w→z4∀FBεE⊂⊂λ⊂⊂!∧BDP#r]⊂192Xux7t[:≥P8≤7qrrY⊂;tz~⊂∩(εBεE⊂⊂λ⊂⊂&DBDP)bYP0r;_w1rrλ32pz≥y2yP≥w22yλ)z2x≤4w3@∪pqy7H"|80[9tww≤WεEεB&wy2H r;0[1rr⊂⊃2pz:\2yFEβEεE⊂λ⊂)rf→qz4{→v<P:≥y74g→P7w⊂≤z2x≥βEεE∧BDP⊂⊂λ⊂∀9z→x⊂37[XP37[Y⊂↔↔∀FEεB$s⊂:~4yP1[vvpw→⊂4yP≥<x2rλ0z⊂:≠x⊂62]2v⊗⊂≤z2x8~w3P;Zv6⊂7≠z⊂⊂1[vvrw_rP4v[rr4p]2v<VβE1:zλ90z4→y⊂;t→w⊂:4→P2{0[:pz7\⊂34y≤z⊂2w_wzw:→y9P0H)Vr|≤92yyZww⊂;Z7yrP_py⊂⊂~yP7w→FE7sλ⊂37wLV⊂37[Y⊗⊂⊂→z1W⊂λ*44yH⊂37y≠P;tv≠∧z42[⊂24y\60|Pλ0z⊂:~2P⊂1[w9wv→V∧pw→⊂:42CE2{0[:pz7\⊂;tv≠⊂12P~w⊂9z→x84w→P6wr→P;pt]4w3P→7y⊂0H1wvvXw2⊂1Z0y0q]2y↔εBεE⊂⊂λ)z2x≤4w3P∪pqy7H"|80[9tww≤]εEεB⊂⊂⊂$Y⊂:42H9z2x≤2y⊂4\P897Xrrr2Y⊂;tz~⊂⊂0P∂9x0qY←⊗⊂4]⊂;tv≠⊂77zλ9z2xλ⊂:42H2|2q]z4wwβE7s⊂≠pqy7H⊂2|8_w9tw[9V⊂1≥z⊂⊂;Zv6⊂9_z42yαu:yzλ9t7{H⊂:42H92yz[:⊂⊂7Y⊂:42H⊂6pq\7P7sβE2|8_w9tw[⊂0w2λ;ptzλ37y⊂_w7z4→y⊂1w[vpw2εEεEλ⊂⊂*7H9rrP≥42P2↑2qzz~ww⊂7Y⊂:42H6pqy≠P2|8_w9tw[⊂4z9Yv3⊗⊂≤97qrYr⊂:4→P9z2\82y⊂≥tz4εB0w⊂&H4w9z→pr⊂7Y⊂0P≡≤x0qrO↔εEεB⊂⊂⊂*\tw3P≤z2x⊂≥tz4⊂_92pu\7tw:≤]εEεB⊂⊂⊂*~2P0q≠{2P2→yqy4\:4wwλ0x86~ryP:≠P::y≠4w3P≤z2x8~w3P7[⊂0w2λ7s3⊂→v7q0[6<P0]⊂:7xβE62{→v↔∧f[y2P2→z0tvλ4yP7→qryyXy<P:≠P:yrH9z2xλ362|~q6<P~w⊂0w→⊂7zzλ7s⊂1≤2pux≠tw:9CE∀2W→W⊂:7Yrz42\⊂;tz~⊂:90XrTWεBεE⊂⊂λ$s⊂9]2x84[3P4yH::y7→r⊂7wλ1<P∀≤z2x⊂≥∀P0zλ:7x⊂≠2{2v⊂:42H2{0v≥pz7yλ;tv6λ''j⊂_2FE4[⊂⊂9z→x84w→P⊂6wY2P⊂;Zz44wλ0P⊂1≤2pux≠tw:⊂λ67wx⊂⊂⊂$Y⊂<wzH⊂;tyZ∧z7Pλ:yrP≤z2x8→rεE2]0v:p]4ww⊂λ;tz4~w⊂0Pλ192pZP⊂67[x⊂<w]P⊂6z\z⊂::\7⊂⊂4]⊂⊂7wλ67qp[6<P⊂_<P⊂∀≤z2x⊂≥∀WεE⊂ww;2\9rv<K⊂4s⊂≤z2x8~w3P;XyP77]⊂::y≠2r⊂7[⊂⊂0zλ:7x⊂≠2{2vλ0w2⊂~z⊂4yH::y7→r⊂⊂7[⊂1<FB∀9z2\⊂:∀P~w⊂0P_92puH67wx⊂4z⊂≥tv6⊂∪'j⊂1→P7w⊂≥t2w⊂≤2z:y≠⊂4yP≠pr2P→97vPλ:42P_92puCE67w\⊂1<P (↔εEβE&py_t⊂→Vλ_\[\BDDP⊂λ YVXK~W~∧BDP⊂⊂λ⊂⊂⊂(_srP→KZ_FEManual
However, executing (step nil) inside a break loop will turn off stepping
globally, i.e. within the break loop, and after return has be made by $P.
The most useful feature is the following, however:
(step) Command at top level has no immediate effect.
After (step) has been executed at top level, a subsequent (step t) inside of
a break loop will have the effect of turning on stepping mode both inside the
break loop and globally, i.e. the evaluator will start to step as soon as the
return is made from the break loop by $P. Thus, for instance, one could set
trace to break at some special place, and then use the break to turn on
stepping.
prinlevel and prinlength:
In the present version, for convenience, prinlevel and prinlength are
lambda-bound inside the hooking function to 3 and 5 respectively. These could
be changed by editing the expr code and recompiling.
When the P command is used, prinlevel and prinlength are temporarily bound
to nil, and the toplevel printer (the value of atom prin1) is used to redisplay
the current form.
Overhead of Stepping:
If stepping mode has been turned off by ↑g, the execution overhead of having
the stepping packing in your LISP is exactly nil.
If stepping mode has been turned off by (step nil, every call to eval incurs
a small overhead--several machine instructions, corresponding to the compiled
code for a simple cond and one function pushdown.
From an overhead point of view, running with (step) entered at top level is
the same as running with (step nil).
Stopping stepping by responding <tab> incurs the same continued overhead as
(step nil).
Running with (step foo1 foo2 ...) can be more expensive, since a member of
the car of the current form into the list (foo1 foo2 ...) is required at each
call to eval.
Page 3-42 ∪3-1.5.4 March 3, 1979
The System
In terms of memory requiRementq( The total compiledAgiKAaS]NαβCπ∂↑∨∀∀Ts∂∂WεK↔Mβ∞∪?WQβ!IMβ>{K∪Mε{⊂∩ε-≥f∂↔∀
π⊗↑x,⊗jπ>Mwε∞|U`hPβ"H∧∧∩;]↑X8⎇
≥{H∃m≡~λ→\]9`⊂_w2⊂*≤αace:
~∀@A≥↑↓caKπ%CXAS9iKeC
iSO]LAWLAQQJAgQK`Aa¬GWCO∀AoSi AIKEUJXAiICGJX↓←d@A¬]rA←β##↔HhSOgO&+5βC∞≠ ≡∞|Z2ε∂,TεNv}⎇b`h!Q h⊂⊃⊃∩αα∧
FF* ]w⊗>]n7&/-`¬∨&↑
ε/⊂Q!PBα∧
FF(α3;ny;\nL<[@∧
⎇→<∞<Hλ∧∞_8rl≤y"0_≤5{4b→yP⊂"→q:ssZw3P⊂λ1p`⊂AbidiTias f`∂d~)S]iKIaeKi∃HA ∪M Aae=KeC[LAiQCP∪CeJ↓G←[a¬eCEY∀Ai↑Aβ##∃β≤∧↔ε∞-→FO&≤↑2απ∞-w6NL\Bε↔⊃Q$$∃λ⊂∪≠y⊂ y\prq6→y⊂1@/de. Thes@∀AGC↓¬ESISQSKfA%]GYk⊃Jt
∀4∀∩∀b$A'S]≥YJAgQKaaS9JAiQI←kOP↓iQJA∃mCY.S'?rβ?→αλβ∪G;≥#'?9ε;⊃β⎇3↔Iβ⎇⊃↓β'w#=β?&C↔H∀R↓↓↓βNsS↔K¬∪↔S↔ β∪W≠≥#'?;~aβ←#.qβ∂πfc↔⊃1αβ?9βλβO↔3.≠S'[*βπOO→βπMαβ∪↔S/∪7';.!βdhQ↓↓↓π##∃β/≠↔I9αα↔π∂BβOW∂Bβ≠?Kjβπ;⊃εKSMβ⊗+OW3&K;≥β63W∃εkπeβ⊗)β∪'∨β3πg.!84(hQI%α'K;π7N→βK./C?NsS';:β?9β}s∃β?∩β7?K*β?→β&C∃β≠}c3?←Ns≥β∂}s∪'SN{;Miα↓βS#*β≠?Khh)↓↓αβ?Iβ∂#?5β∞∪?WQπ#=β*β↔[πg+πS↔"β7πS≡C↔Mβ
βCπS&+K9βN{UβC⊗{['∪+YβS#*β≠?Kjβ↔'v84)↓α↓β↔[∞cWπS.!β';6{3[↔~β¬βOε+∂'≠N+⊃β≠.s∂S'}qmβ¬ε;'[↔rβπS?nK
βONk?1ε+[π3.S↔Mπ#<4)α↓↓β¬ε;'[↔rβ[π3.)mβ¬ε;'[↔rβπS?nK
βONk?1εKMβSzβ∃β⊗{W;⊃εK9β¬πβK?≥b↓β↔'&C↔Iβ'KC∀4R↓↓↓β}0'∪=bβ?H'∞q↓β↔61∨⊃εcπ7& 7↔cπ∪↔OON{9m↓ε{IβWε{8'πr↓βπK⊗KSKπ↔Iβ∂?v#'S'}p4)↓α↓βOC.≠'≠'.!βeε βCK.#'∂π&)β←KO#S↔9εMα2M~Aβ∂}#∃84Ph)M%ααK↔S/∪;';:β¬↓β&K≠≠↔⊗+;Qβ63W∃αβ≠?Iε ↓β∨O3↔9α~k↔cC⊗+OO'}q9↓↓¬##'Mαβπ33␈;Mβ≠␈⊂4)↓α↓β∂#∞s∨';:βS#∃ε∂S'}qβS#∂!β←?.c⊃↓β⊗)βO↔f+∂S↔"βeβ≡{;∪'&K?;πg→β'9αβS#∃πβK?∨⊗44)α↓↓βπv!??Iε∪eβ∨z;M↓βNqβ¬βπ∪?≥↓ε{Iβ∪zq↓αg␈)↓β∂∞qβπ3≡yβ∨=αβS=β∞seβS∞9↓β'w≠'∪∃π##∀4R↓↓↓β∨+KK↔w!βCK}984(hQQ%α&C↔O∃ε≠πCπ⊗K3'SN+Mβ7∂Iβ∃π∪↔GW/≠S↔⊃π;#↔9π##∃βπ∪?∨K∞iβ'MεK;'SN33eπ≠SπK&+⊃βHh)↓↓αβ¬βS␈↓73↔6+1β≠␈∪51β␈⊃βS#/Iβ7πJβ∃βNs'S'∂#↔⊃β∂!βπ;Jβ?S#/⊃βC?NsQβ'rβS#∃ε≠?WK≡(4)↓α↓β?→ε+c↔∂/#'?9αiβ↔'&C↔Iβ7∪?5β&C∃βS/∪7';∞aβ←#Nc∃β'rβ¬β⊗+π/C}K;Q1αβ?Iβ&KK↔∂&cd4)α↓↓βJβS#∃πβK?∨⊗584Ph(4)α↓αS#*βOS↔πβ↔Iβneβ*β';[}[↔⊃βNs'S'∞c3eβ↔IβWONs≥βSF)β≠Wv≠S'?rβ7↔YεM↓β}s∃β←␈+3⊂4W+O∃β/3π1β}1β?;*βπK∨.k↔;QZβ∃;≥pI↓#7/1↓≥#6≠9βπ⊗9Eβπ⊗9I%%r↓α≠K}iβ¬↓ε∪K↔π←β?';"β?H4VK9↓β
βCK??∪π50O##∃β∨#↔CC/⊃↓β7∂Iβ∃αβSWKv+⊃β?pKeβNs[?/Ns≥↓↓FC/OS∂∪Q$'>KS!βvx4+π⊗;W7↔w#M9↓∧KQβ7∂Iβ∃π#WK;.!β?≠2βeβ&C∃βEε≠?77∞s⊃β∪/≠∂K'⊗+⊃β.c?]1ε{Iβ?2β∂?W↔≠∀4(hP4*7∂∪∂!↓~a↓Ee;H$$%α↓MMk 9U9 H$%↓α↓↓↓↓¬βπ∨∃β→5QLhP0$$J↓↓α7∞≠3'OααK↔≠/∪↔;∂*α7π;.04(hP4+Jβ¬α∞%∩1?≥ε∪K↔πZq↓απ7#↔Iβn+Yβ↔63Wπ&+Mβ''→βπK?+7↔;"aβ'Qπ∪↔SW⊗sMβSF)↓β[∞cW∃β∞s⊂4+'+K;Mε{≠→β&C∃↓β∨#↔CC/⊃9↓αv{S∃β&CπQ↓εK9βSF)βπ␈3∃β↔F7C3*↓βS#*β≠?Kjβ∨'[.q↓βπ~βπ84VK∨Wn+;Qβ&yβ7↔2β←πMπW?S.!9↓αN11βO∂I1βSF)β[πg+∃β?2β→β←∂→βS#*↓αM7/CCK↔∨≠'?9αC≠∂8hSπK≥
βπK≥∩I1βSF+9β?v)β∂?.c⊃βW≡)↓#7/1β→%εK;OS.⊃84Ph)↓↓∧Q↓β∞seβC}K;Q↓ε#WK'v9βS#*↓βOS/βC';:a↓β?v)β7πJ↓β';∨β↔∂Qπ##∃↓π3π3W/→↓β?2β?S#/⊂4+[∂∪'πf+M1β∞s⊃β↔6+9↓β⊗+πCCgIβ7↔2βS=↓ε;eβ6{K58M##'Mεkπe↓ε∪∃β∪}s∃β'r↓β↔'&C↔Iβ}04+SG∪↔∃β>gM9α↓α↔π≡Aβ∂?nkπ;⊃π;'31αβ∃βπ∪?7C&+⊃β≠␈⊃↓βJ↓==1π+OWπfce↓β6{33?>K;≥β&C∀4+fOQβ6{K5βπ∪';S.!β?W"p&π;JαM7↔GβK↔O≡K?9β&CπQβO→βSgε+⊃β←FK∂!βO→↓β;␈!βK↔≡{∨;'V+⊂4+∂→β¬β≡{77πv!β←'faβ∃ε+[π1>!↓#←O##'9ε9β↔↔∪O↔Qπ#=β∂∂#∂!β/∪K?K~I9↓α∞cS↔KvS'[.ce04W##∃β*β∂?7n;⊃β&yβ↔[∞a↓βπwIβ↔cπ∪↔OON{91β␈⊃βS#*β!↓β≡{77πv!βS=ε;↔Qβ
β;'∂(KSgC*β?_4T~RJ1|AβK.-9↓αBS#'~β'Mβ⊗+π33Jβ¬α∞%∩1? ε∪K↔πZaβW"β'Qβ/≠↔⊃β&yβ∃∧~RJ1}A↓βOzβS#∀hS∂?7n;⊃βFCC↔w→βS=ε∪∃β∂∞c3↔⊃εA9$4Ph)↓↓εK9βSF)β'S~β'7Cd+7↔≠&S'?rβ↔π∂B↓β∂?nkπ;⊃εkWOQε∪∃β≠}c3?←.!βeε ↓βOε∂∃↓G+;3↔∨_4+SF)β∂?nkπ;⊃αβ'Mβ
β3'O"I9↓↓εK9βSF)β7Wg#'∂Mαβ'7Cf+7↔;&S'?rβ↔π∂Bβ∂?7n;⊂'o+OQβ⊗(4+≠}c3/←.!βeε β;↔>c';∃pKπ∂S.33EbβS#'~β∪↔C.s∪Mβv{Qβ?rβS#∃εK7C3.k↔;S∂#'?9ε∪WQβ}p4)#∨#πSW~β3';n{∪∃%r↓β↔π≡Aβ≠?⊗iβπ; ↓βK↔∨+3Qβ>C'∂!εKEβC⊗K;S↔ β?WQ¬;'31αβ∃β4{33?>+⊂4↔I↓∂;.k↔I∧K;∪'≡S';:βS#∃f evaluation (i.e. stack depth since
invocation).
the primary commands are:
d (mnemonic for down) go down to the next deeper level of evaluation and
display the first form there before evaluating it. e.g. if the form is a
function call, this will display the first argument of the function if it
has arguments in the call; otherwise it will display the first s-expression
of the body of the function. it then prompts for the next command.
e (eval) can be used to evaluate an arbitrary expression. it starts a new
line, waits for you to type the expression, then eval's it within an errset,
and prints the result. this is comparable to just typing the expression or
atom after the //, but cannot be confused with a command, and the format is
nicer.
h (control-h) enters a break loop, and when $p'ed displays the current form.
within the break, one can inspect the values of variables, etc., and even
reapply mev to any form.
n (next) Display the next form at this level, without showing or inspecting
the evaluation of the lower levels of the current form. The value of the
current form is displayed first. If you wish a condition to be tested for
at lower levels, use nn instead.
Page 3-44 ∪3-1.5.4 March 3, 1979
The System
nn Like n but slower since it inspects the lower levels. Use instead of n when
testing for a condition.
u (up) Go up to the next higher level of evaluation and show the next form at
that level. The form(s) at the current and lower levels are evaluated
without display. As an example of its use, after you have seen the
evaluation of the arguments to a function, the next form to be evaluated, if
the function is being interpreted, will be the first S-expression of the
function; to avoid seeing how the function is evaluated internally, you can
type u. Note that the lower levels are not inspected - thus if a condition
is to be tested for at these levels, use uu.
(u num) If num is positive (or zero), forms are not inspected nor displayed
until level num is returned to. If negative, it goes up (abs num) levels
relative to the current level. Thus (u -1) is equivalent to u.
uu Like u but slower. Use if testing for a condition.
(uu num) Like (u num) but slower. Use if testing for a condition.
q (quit) Exit from the stepper.
s (show or display mode) For datapoints and other display terminals, this
gives a nice easily read output of selected levels that constitute the
context of the current evaluation. Specifically, it selects the current
level for sprint'ing (pretty printing) as a "header", and as you go deeper,
the local context is abbreviate-printed under this header, and the current
output will be sprint'ed. s may be used as often as you like. Headers
will automatically be popped when you return. The command (s num) selects a
particular level as a header. It and the command sn and several user
settable parameters are described in the more detailed section below.
(= s-exp) The S-expression is substituted for the current form and another
command is prompted for (i.e. you can step into or over the new form if you
want to). When the resulting value is returned it will be as if the
original form had yielded that value. For example, you can change the
apparent truth or falsity of predicates or bypass a (go label), as well as
just returning different values for an S-expression.
(cond ...) Tests for conditions prior to evaluation of each future form, and
when satisfied will print a message, display the form, and wait for another
command (which may of course be h for a break). The argument to this cond
March 3, 1979 ∪3-1.5.4 Page 3-45
Maclisp Reference Manual
is an arbitrary S-expression or symbol which is evaluated like a predicate.
This is similar to the cond feature of the trace package.
In specifying the predicate, the form about to be evaluated may be oBtained
as the value od∧AiQ∀AmCe%CEYJJKM←IZT@AQQJAKaaeKgMS←\@!Q←←W1KmKX$AeKiUe]fAQQJ~∀@AeK1CiSm∀AYKm∃X@A←_AKmC1kCiS=\\@@↓≠←eJ↓iQC\A←]J↓aeKI%GCiJA[Cr↓EJ@A≥SmK\0AS\~(@@Ao!SGPA
CgJAQQKrA¬eJA←HOKHAQ←OKi!KdXA∃qGKaPAoQK8Aio↑↓CeOk5K]if↓MWeZ↓BAga∃GSCX4∀@@AQKghA¬fAIKMGeSE∃H@AS8AiQJ↓[←eJ↓IKiC%YKH@↓gCGi%←\AE∃YWn\A)QJAG←]⊃SiS←8AoSY0~∀@@↓eK[C%\@AC
iSmJACh@↓CYX@↓YKmKαcEβSFQ↓β∂∪∃↓βNsOC↔≥#↔⊃↓ε∪e↓β&C∃↓β≥#↔CC/⊃βW;&K04 α↓β↔cεc'∂'&ceβS/∪;↔⊃ε{≠→β↔I↓#∂}s⊃β;Na%λ4Ph)↓↓αC7πS≡C→↓9rq%↓βO→β¬↓ε3W;∂&K?9β>C'∂!αβ←'∪bβCπS&+K)↓εkπS∂Bβπ∂πNsOQ↓π##∃β≤εW↔⊗]n@hR∧∧ε6␈-Ub∧OD
V∂J,Rαπ↑<V"ε≥dπ&FT∞π⊗.M≤6∂&T
v"α∞Mε*ε=⎇f"r∧¬∧∞g=tπ≡.T∧εO'4∞&.f≡LV h$∧απ/<Tε∂~∀ε≡}]\⊗v"e∀α¬&Tε∂⊗}]V.wD
Fzε\≡F≡Fd
↔~ε=⎇Wε∂,\Bπ&t∧R.6}-Rαε]LVn.nDε↔HQ$ααε]LVn.nDε7⊗⎇Tεf.nDαπ&t∞&N>∞EBε∞lDπ∨.<<V.'4∧π>F]dε.∞=∧ε.f]\Vw"
|bαπMRπε≡NF/⊗aQ"αα∞>V≡≡\\G~r∧ v2ε≥↑ε␈↔L≥f≡*D∞FF*∞↔'&↑-bαεl\V"εm}BεNl=G.&T∞FF*]g&O,Tαε6}-Rrα¬!PRα∧
V∂&=W~ε≥o↔&F≥lrrα
Mε*π∞-v≡.N↑&*ε≡4ε∂π
M⊗."∞,V∨/.=↔6.O∀π&z∧∞7.⊗M≡7'~D∞Vvf↑>0hR∧∧π&FT∞7.⊗M≡7"ε≡4ε}2∞Mε*εm}&jα∧4ααree∩εNd∞vFN=∧ε≡∂<Tα~ε≡4ε⊗␈]lBπ&t∧π&FT7/↔,]g h$∧αε.ent of %%form and the cdr (not cadr) of the #-list is evaluated as the
test on that element. Except in this case, atoms and lists should be given
as in the original code since they are not evaluated. Some simple examples
are:
(matchf xyz) succeeds if the atom xyz is about to be evaluated.
(matchf (setq alpha)) succeeds if the atom alpha is about to be setq'd.
(matchf (putprop name * 'source)) succeeds if the property source is
about to be putprop'd on the atom pointed to by (i.e. the value of)
name.
(matchf (setq (# member # '(alpha beta s3)))) succeeds if either alpha,
beta, or s3 is about to be setq'd.
(matchf (rplacd * '(* 9))) matches (rplacd (last urlist) '(2 9 4)).
(matchf ((# member # '(foo bar)))) succeeds if a function call to either
foo or bar is about to be evaluated (more precisely if the car of the
form about to be evaluated is either foo or bar).
nil (cond nil) turns the condition off and saves the current non-nil condition.
Page 3-46 ∪3-1.5.4 March 3, 1979
The System
(cond) When no argument is given, the last non-nil condition (which is the old
property of %%cond) is established as the current condition (which is the
value of %%cond). (If the previous condition was not nil then it is saved
as the old property, thus allowing for alternation of two conditions.)
(matchf ...) is equivalent to (cond (matchf ...)), see above.
The following functions are useful in connection with the stepper.
(hkstart) will initiate stepping when encountered in a program or typed from
a breakpoint. (hkstop) will act like the q command to turn off stepping. (Also
see below for more info.)
(mbak) is a function to be used like the LISP system's (baklist). (mbak)
strips out from the result of (baklist) those functions that have to do with
the stepper.
The remainder of this section is a complete list of the Stepper commands,
which can be used for reference.
Commands which are not lists must be followed by a space. You can use
rubout before completing the command (and its space if necessary).
Alternatively, you may abort the command before completing it by doing a CTRL/x
break.
Any S-expression that you type which is not recognized as a command will be
evaluated (within an errset to catch errors). Thus you can evaluate any atom
or do any function call simply by typing it following the prompting // as long
as it is not interpretable as one of the commands below (or nil). Note that
you can actually go to a tag within your prog simply by typing (go tag) after
the //. To evaluate a form which looks like a command, type (or form) to
evaluate it, e.g. (or a) evaluates the atom a. If you want you can even write
functions which know about the stepper and treat them as commands.
a (all) Automatically displays all forms and values seen by the stepper at
all levels. Typing a space at any time thereafter will cause the stepper
to leave this mode and prompt for a new command. If you want the stepper
to wait for a command after each form, you can use the d command.
Commands a ad (a -) c and cc pause after each new form is displayed if
%%ac-sleep is non-nil. Its value is used as the sleep time in seconds.
March 3, 1979 ∪3-1.5.4 Page 3-47
Maclisp Reference Manual
ad (all down) Automatically displays all forms and values encountered by the
stepper in evaluating the current form (i.e. at deeper levels). Typing a
space prior to completion will cause the stepper to leave this mode and
prompt for a new command. (Also see d.) Sleeps after each form, as
described under the a command.
(a lev) Automatically displays all forms and values at the indicated level and
lkwer (deeper) levels, turning itself off when evaluation pops to a level
with a smaller level number. Typinga space prior to completion will
cause the stepper to leave this mode and prompt for a New command. (Also
sae d.) Sleeps after each form, as described under the a cOmmand.
b Sets a breakpoint to occur after Evaleation of the cuRpent dorm. At the
break, the valua to be retu@I]KHA%b@Ai!JAmC1k@∃↓ε{⊂∩αT↑f∞g\UBαε≥lBαε\∨∩ε⊗QQ"αα∧∧ε≡F≥lv."/∩π≡↑N∩>Nhpαπ&
~2π6≡-⊗∞⊗LUbα¬MRε6}-RαπM↔"π≥≤Vf&\@λ∞M~<h∧∞X;≥,T~<c!$λλλ∧∞~→(∞l9⊃9!≥yH $\Y|[%dλλ∃∂≡→(
∧≥≠h∧∞≤[xl\9λ→N-{(λ∞M→(_N,8:|
⎇;]A∀∩9H∂≥⎇#"D∧λλλ∞∞Y9Y.∧≥~_.D≥~→$∧≤}<nL;(≥l≥=λ∀L≡~→<D∞~_;D∧_\Y,≥h≤y,T≥~→$∞⎇~9D∧_{s-\;YβD∧
_C!$λλλ∧
|→<L≡→<h/(λ_,L~;Yd∞~→(∧⎇<\L]]λ∩
⎇z{→.l;λ≥
tλ ),.Y8:mM<⎇E∀λ⊗;nQ8x;Dy=β!$λλλ∧==≠m\=~8a≤\Y8-=;Yh≡λλ_-Mλλ≠↑Y;≤d↑(λ∞↑z;Yd¬≤Y=={Yλ∧∞
(λ
}H_{ml~=~-⎇X;β!$λλλ∧\Y8-=;Yh≡h→→.<|Z8L\λ_Y-M⎇h→M}H≥~T
≤Y.L{{Y∧¬KKJ${{;,≥YC!!"Xh∧∧λ
_n↑\Y;NE(⊂=.M{8=
≤x;≠∂∀→~<n
_><d;≠λm|[<d;Yλ∞l;≥9.4_=λ
.<⎇λ∧∞~→(><\Y-nβ"H∧∧λλ≠↑Y;D∧λ∃≡.
;Yh⊃<|_,<(_=∧∧_;↑$∞~;9$∧→≥<M≥Yh≥
"9~.>≠_>$∞z;≠∧∧_x=.<(≥~Q"Hλ∧∧λ≤⎇↑≤→<D∞≠h≠\=Y(∞M~<h
]y→(≥Yλ≤∞-{<≥∧[|H∀≠Y=d{{;,≥YH∧
~→(∞>→<≤↑H→≠l↑c"H∧∧λλ≠M}λ~;N>→8⎇∧∧≥~→$[|[.4λ≠yD
≠⎇y.$λ≠→.l;≤h¬T≥~≥.4λ~9D(λ_m⎇Y~=
≥{H~.4λ≥≠dY#"D∧λλλ∞L<⎇→,D→[|D=λ≥
<y(
L=Y;∞5λ≥<lT_xkD∧λ∀{\<≤h≤]→<D88z∧[|[%D_<hL<x|M≤Y9β!$λλλ∧∞;Y→.$≥~→$(_{m]8;Y¬a"C"L<hλλ M:y(5λ_].D~;\n8⎇≤d∞~→(
M⎇y<D
→=Y-NkC"AQX⎇≠ltλ⊃[
≡≤hλ∞M→( $\{{Y
m⎇_;
M⎇hλ∞Myy{T≥z~,=λλ~.4~;Z.M8;≠∂∀λ≥∧
98;M≥YhλMh≠[nA"Hλ∧∧λ_;
M⎇h_eDλ≠+∧
Kλ≠n$λ≥(={;8-l≤h~,a8(_m⎇Y~=
≥{H~.18Y:-lh≥→.>→9λ∧[|KD∧≠Z;↓QHλλ∧∧≠98-nh_;
M⎇h≥
<y(≥↑=x/∃C"C!%_{{LDKKE∀λ∃→.>≤h→M}H_{ml~=~-⎇\h≤∞-;|H∞Mh→=L≥≥8=
≥{H≠ld→88m∧→]=∞↑Y(λm|[+D∧⊃[|AQHλλ∧∧≤_=∞L<[H
\=_z
≥Yh_,|:;\nD≥~→$[|[$∞<z;Lt≥~→$
8=_mH→]-l⎇~;md_;Y∧∧→[|D
⎇~→.!"Hλ∧∧λ~;Lm|[8.M;{H∞<9(≥
(→→.<|Z<∞M;{H
|H
_m⎇YλEeJ(_,-⎇Y+AQC"\n8z8-D≥→<nNh→[n$
_{mlλKEe(∞C!$λλλ∧
≠hλ≥9λλ∞M→(≤n8z9M≤x=~-⎇Hλ≠ldλ_{m];{H∞L<⎇≤eDλ≥~Tλ→[mM≠⎇z-lhλλLm_9|d$_<Y!QHλλ∧∧≤≤[nm9→9∧¬(≥~T≤x;,T→9YL\⎇≤h=⎇;→∧Y(≠l._:;L\λ_↑$
;\|\⎇~;Lt )9M}[(~-d≡;⎇.!"Hλ∧∧λ≠⎇md≤≤Y,M8x=T→z=L]H≥≠d∧_{{LEHλ∩,d first argument to the cond is from
Page 3-48 ∪3-1.5.4 March 3, 1979
The System
the set (form formq bind bindq atomval atomvalq fcn fcnq and andq) then
the second argument is used to derive a test. This process is repeated
with the remaining arguments, if any. The resulting tests, together with
any remaining arguments not satisfying this process, are effectively or'ed
together to derive the overall condition (except for the and andq flag
special tests which are and'ed). The arguments are not evaluated when
typed but are evaluated each time the condition is tested. These flags
each may be used more than once.
The meanings of these flags are:
andq The next argument is and'ed with the remaining tests, and
must yield a non-nil value for the remainder of the
condition to succeed. (See the comments for cond in the
"complete list of commands" below regarding the use of side
effects)
atomvalq The next argument should be a list of two elements, the
first an (unquoted) name of an atom, and the second the
value of this atom for the test to succeed.
bindq Watch for the following (unquoted) atomic symbol to be
bound in a prog, or in either type of do, or an explicitly
evaluated lambda (as distinct from an applied lambda or
function call).
fcnq Watch for the following (unquoted) function name to be seen by eval as
the car of the form about to be evaluated. (This cannot
check for applied or mapped function calls).
formq The following (unquoted) S-expression is to be watched for. E.g.
used to check when a particular variable is about to be
evaluated.
These evaluate their argument each time the condition is tested
and
in order to get the desired S-expression or atom name, and then
bind
perform like their "q" counterparts. These are particularly
fcn
useful if the flag's argument is the value of a variable. (Be
form
sure not to change the variable's value accidentally while the
atomval
condition remains in effect.)
As a simple example, (cond fcnq rplacd) will check and stop when the
March 3, 1979 ∪3-1.5.4 Page 3-49
Maclisp Reference Manual
function rplacd is about to be used (i.e. when it is the
the car of the form to be evaluated).
The commands c, m, n, and u do not inspect all levels, and thus the
condition cannot be tested for at these levels. You can use cc, nn, mm,
or uu instead, or use the ctog command. Naturally, condition testing
slows the speed of execution at levels that are inspected by the stepper
but which you do not have displayed.
If you choose to, you can have your predicates produce side-effects such
as recording information of value to you or setting states for use by the
condition later. You can use the and, andq flags (more than once if you
like) to have the expressions executed even upon success, so long as these
flags appear first in the condition. Other conditions are evaluated in
the order of appearance until the first success is found.
d (down) Displays the next level down (as described above also). Note that
if the form is an atom, the effect is the same as the n command. Hence if
you want the stepper to display every form and value, but to wait for a
command after each form, just keep using the d command.
e (eval) Can be used to evaluate an arbitrary S-expression. It starts a new
line, waits for you to type the expression, evaluates it within an errset,
and prints the result. Comparable to just typing the expression or atom
after the //, but cannot be confused with a command, and the format is
nicer.
(= S-exp) Replaces the current form with the given S-expression, and then
prompts for another command, as described above. If two arguments are
given, then this expression will not be treated as a stepper command,
rather it will be evaluated (see comments at top of this section).
h CTRL/h break is executed. The current form is redisplayed
when $P is typed. The form about to be evaluated is the value of %%form.
Within the break, one can inspect the values of variables, etc., and even
reapply mev to any form.
k (kill) Does not evaluate the current form nor display any
value. This is good for avoiding side effects if restepping through a
program again. Equivalent to (= nil) followed by m command.
Page 3-50 ∪3-1.5.4 March 3, 1979
The System
lr (last result) A complete rather than abbreviated printout
of the last result is given. (See (p - -) for further information.)
m Next, like n but the result of the current form is not
displayed. If a condition is to be tested for at lower levels, use mm.
(matchf ...) is equivalent to (cond (matchf ...)), see the the description of
(cond ...) above.
mm Next, like nn but the result of the current form is not
displayed.
n (next) Displays the value of the current form and displays
the next form, then awaits the next command. Does not inspect the lower
levels. If a condition is to be tested for at lower levels, use nn
instead.
nn Like n but inspects the lower levels.
o (old) Does (mev 'last form). This is useful for seeing
how a form produced an unexpected value when you went over it with n or
nn. If reevaluating the form can produce side effects be careful. Can be
exited from by the xx command. (The old form is the value of %%oldform.)
ol (old, at current level) Does (mev 'last form at this
level). Behaves like o. Useful to see the form (at this level) which
produced the current value - rather than the last form printed out, as o
would yield. (The old form used here can be obtained by (get %%hooklevel
'oldform).)
po(in)(print) Redisplays the current form. This is useful if you wish to
clear the screen first with control-L. Gives typical abbreviated display
(see (p - -)), except has somewhat different effect if in display mode
(see s command). (For hackers of special data structures, e.g. "owl",
March 3, 1979 ∪3-1.5.4 Page 3-51
Maclisp Reference Manual
printing will be done with the function which is the value od the atom
prin1 if non-nil - as also applies to top-level in LISP. This value of
prin1 is checked only in the mev function. Moreover, unless you request
LISP not to "snap links" in compiled code, you may have to reload the
stepper after changing prin1.
pp (full print) Gives a complete printout of the current form.
ppp (even better printout) Pretty-prints the current form using the sprint
function. Uses a lot of screen in general, and so will turn on pagepause
for you.
(p - -) Resets the parameters for the abbreviated printout used for results,
forms and the p command. The first parameter is the prinlevel, the second
is the prinlength; both must be given. If nil is given instead of a
number no abbreviating is done with respect to that parameter; thus (p nil
nil) turns off abbreviation. (The current settings are the value of
%%hookprin.)
q (quit) Exits from the stepper. Previously requested breaks and conditions
are disabled, and any non-nil conditions are saved on the old property of
the condition name. (Control-G also exits as usual.)
s (show or display mode) For datapoints and other display terminals, this
gives a nice easily read output of selected levels that constitute the
context of the current evaluation. Specifically, it selects the current
level for sprinting as a "header", and as you go deeper, the local context
is abbreviate-printed under this header, and the current output will be
sprinted. s may be used as often as you like. Headers will
automatically be popped when you return. All sprinting is done with
pagepause on. If control-X is typed during sprinting, that expression
will be redisplayed using abbreviated-printing instead. When in this
display mode, the p command will clear the screen from the last form down,
unless preceeded by control-L (or if wrap-around occurred), in which case
the screen is fully redisplayed. Also see (s arg) for more information
and options.
(s arg) If arg is positive, this selects the form at that level as the
"header" for s(how) mode. If negative, it uses the form at arg levels
above the current one. If arg is nil, display mode is turned off (headers
are remembered though). (s t) just turns display mode on if currently off
using the previously remembered headers if still applicable; but if it is
Page 3-52 ∪3-1.5.4 March 3, 1979
The System
already on, this pops the stack of headers by one (normally headers are
automatically popped when the level is returned from). All sprinting is
done with pagepause on. If control-X is typed during sprinting, that
expression will be redisplayed using abbreviated-printing instead. Also
see the sn command.
Several parameters are user settable from their defaults. %%lowerdisplay and
%%lowerdisplay-min control the maximum and minimum number of levels to
display below the header (defaults of 5 and 2). This is done in
abbreviate-printed form using %%shortprin which is a list of the prinlevel
and prinlength (defaults 3 and 3). Sprinting of forms and results will be
abbreviate-sprinted by the msprint function if the flatsize of the
expression exceeds %%flatsize-max (default about 450). The prinlevel and
prinlength for the latter are the list which is the value of %%sprintabbr
(default is (7 8)). If %%flatsize is nil, full sprinting will always be
used; (if negative, abbreviate-sprinting will always be used so that
infinite printing circular structures will sprint and abbreviate-print
finitely. To turn off sprinting of results setq%%result-sprint to nil
(default t). If %%mdistitle is neither nil nor a number, it will be
evaluated just after the screen is cleared, allowing printingof a title.
If it is a number, that number of blank lineS will be left at the top of
the screeN (also see sviewmsg function below). If the partial clearing of
the screen bothers your eyes, setq'ing %%eyestrain1 to a number of seconds
(e.g. 0.5 to 2.0) widl slow down the new display depending on the number
oF lineq cleared.
¬
Sn Just fop s(how) display mode. It prevents clearing of the screen after
prompting for another command, but only until the next prompting // after
that. Useful if you want a result to remain displayed a little longer.
If you want to prevent clearing of the screen for more than a couple of
times, use (s nil), then do (s t) when you want to resume display mode.
(retcond ...) Tests for conditions just after each form is evaluated, and
breaks when such condition is satisfied. At the break, the value to be
returned is the value of %%value, and may be changed by setq'ing this
variable. The form that yielded this value is the value of %%form. Type
$P to proceed from the breakpoint. The conditions are specified as for
(cond ...). Note that (retcond t) will give you a break as each level is
popped (returned from), including levels above the one where the request
was made. (retcond nil) disables the retcond. If you prefer waiting
rather than breaking see the wtif command.
Two additional flags are available:
March 3, 1979 ∪3-1.5.4 Page 3-53
Maclisp Reference Manual
valueq The test (equal %%value next-argument) is performed as if it were
and'ed with the remaining predicates in the condition.
value Like valueq but the test is (equal %%value (eval next-argument)).
The overall condition is maintained on the value of the atom %%retcond, and
the previous non-nil condition is on the old property of this atom. If you
want both cond and retcond conditions to be the same you can (setq %%retcond
%%cond). The value and valueq predicates will be ignored in a (cond ...).
u (up) Go up to next higher level. Current and lower levels are executed
without display. The lower levels are not inspected - thus if a condition
is to be tested for at these levels, use uu. This can be used to skip the
display of a function's internal evaluation after having seen the
arguments, as described in the previous section.
(u num) If num is positive (or zero), forms are not inspected nor displayed
until that level number is reached. If negative, it goes up this number
(absolute value) of levels relative to the current level. Thus (u -1) is
equivalent to u .
uu Like u, but also inspects lower levels. Use if you have a condition to be
tested.
(uu num) Like (u num) but slower. Use if testing for a condition. Note that
(uu -999) effectively means that you won't see any levels unless the
condition in a cond or retcond is satisfied.
wtal (wait-all) Flips a toggle which when on causes a pause after the
evaluation of every form, but before that value is returned. The system
waits for an input character. Typing y(es), b(reak), or h (for control-h)
followed by space will cause a break as would the b command. Typing just
a space, or any other character followed by a space, will proceed from the
pause. Default is off.
wtif (wait-if) Flips a toggle which when on causes requests by the b and
(retcond ...) commands to result in a pause rather than a break. The
pause is like that of the wtal command, and may be proceeded by a space;
or a break initiated by typing y, b, or h followed by a space. Default is
off.
xx Does a control-X type of LISP quit. (A control-X typed after the // prompt
will be caught by an errset. The xx command is executed outside of that
errset.)
Page 3-54 ∪3-1.5.4 March 3, 1979
The System
The follkwing other facilities exist:
¬
(gethkleveL num) This function retuRns the S-expression that iS on the
execution stack of the stepper at the given level number (see hkshow).
Can be used to get an unsprinted unabbreviated display of the form or to
record op process the form as you desire, includingreapPlication of mev
to it In the current Context.
(hkshow num) This function will display previous forms which are on the
execution stack, as seen by the steppep while iT has been activated∞ The
previous num of leveLs are shown, with the cUrrent form last. If no
argument is given, then all levels are shown. The display is done under
the control of prinlevel and prinlength which are settable by the (p - -)
command. Of coUrse this function cAn also be used as if it Were a command
by typingit after The prompting //.
(hksprint num) This funcTion will sprint the form on the level whose number is
given as the argumeNt. Can also be used as a command.
(hkstart) Use this function to invoKe oR reinvoke the stepper from a
breakpoint Op from a program as descRibed abovE, If qseD within a break,
type (hkstart) by itself rather than within another S-expressionor¬
function, as it has to clImb the stack Fpom The point Of invocation. Ib
an argument is given to This dexpr, it will be evaluated just prior to
establishing stepping, with ↑w bound to nil, so thatyou can print out
information if called from a program.
(It is possible for the invocation of the stepper by this method to have
limited scope under some circumstances. Such a boundary would be a second
breakpoint higher on the stack or a previously terminated invocation of
the stepper that is still on the stack. Also if the program was initially
started without mev, and stepping is retained thoughout the rest of the
execution, stepping may also remain for forms typed at top level - to stop
this just do control-G (or use the q command) .)
(hkstop) This function turns off the stepper whenever executed - in the same
manner as the q command would.
hooklist is an atom whose value is inspected before each attempt to read a
command from the console. If hooklist is non-nil, it is assumed to be a
list of commands to the stepper - each is printed out when used and
treated as if it came from your typein. hooklist is also examined at each
March 3, 1979 ∪3-1.5.4 Page 3-55
Maclisp Reference Manual
level that is inspected by the stepper even if no command reading is done
(e.g. nn or uu modes).
(mbak) This function giveS (baklist) buT without the steppep functions, As
described above.
(mev top-form) This function initiates stepping and otherwise acts like eval
α of one arguMent, as described above.
(msprint foRm) Gives abbreviated sprinting of the form. A second and thiRd
numeric argument qpecify the efFective prinlevel and prinlength here, else
a list of two numbers found as the value of msprint are useD∞ The current
impl@∃[CMi¬iS←\↓SfAg=[CoQ¬hAgY=nACF↓iQJAIKOkY¬dAgaIS]hAα#?↔M∧s?Q↓¬∪↔OC|s⊃βSxh)↓↓α↓βOS∞s∪πK"βπ⊗+['π&K;≥8hP4)#∨3'π←o≠≥β3Ns↔;=αβS/↔61%↓¬+O↔≠,a↓β'pβ∂?;W+;∂SN{9β←O# 'MFC?]%∧¬V}&Udαα¬∞ZG
πMPhR∧∧ααε>Z'∞␈$↔"πMRεf≥lVvz≥f"α↑f∞g\≡F/~∞Mε*π<Xλm⎇Yλ_.,⎇;9-nλ∃
;Hλ∞=≥0→≠9P:4→FA⊂⊂λ⊂⊂1z\9wy⊂≥4π iTq origifal position. lineng = 0 means top; id∧A]K≥CiSm∀AG←k9if~∀@@@A→a←ZA ←ii←4XAoSQP@Zb↓iQJA ←ii←4AYS]∀\@A)eaSGC1YrAQ¬mJ@J∃[ASgQSiYJ$QgKJQf~∀@@@@4RAG←5[C]H$AEJA∧A]k[ KdAi<AgWS@AYS]∃bA←\↓i←`X↓C]HAUgJAgYSKo[MN@Ai<AISgAYCr~(@@@@↓s←kd↓IKEk≥KSMN↓S]M←I[CiS=\Ak`↓iQKe∀\∩∀~(@@A∪_AsOJ↓eKCY1rAoC9hAga∃GSCY%uKHAAe←GKMgSMN↓S\Aa¬eiSGUYCdAMSikCQS←]f0∪s←j↓GC\~)S]ga∃Gh@A¬]H←←HAGQC9OJαJ∃M←eZ↓S\@A∧@@QGα{;⊃↓rq9%↓πβK↔∪N≠πS∃bβπ;⊃α↓∃↔[∞cW¬↓εK9β∧hQ#K↔&≠?;⊃α↓999Jq↓α'2↓↓∃↔v{#??↑33π≥εKM↓β"aβ≠?⊗i↓βπv!β[πg+∃↓βπ∪';S␈+Q↓β∞s⊃β∂|k7π; h+K↔∞#';≥αC↔c∂-βQβ≠⊗{5β¬∧s?97vK1β#}{'3'∨!%β'~β';#L∪'S↔ ∧π.wM≥BεOD ↔
π,↑6/"∞Mrεv≥E`hTm}&n∞Dλ6}n\≥f"π∞-v≡/>=⊗v:
≡2εNnmv↑∞D'Jα∧TVnF⎇⎇6≡}U∀π>OM∧α*.m⎇ε}}<mF∞:-w.vD∞Fxh-m⊗br∧λ⊗g≡tF/≡>-⊗⊗.D⊗⊗␈lTε∂⊗T∧R.↔,\⊗↑f≡>BbαT\6}vEDα*/,↑F≡}lEBε∞l@α*.
yv←π-≥bph!Q hS∃fRs*∧
FF* X∃∩∧.,V∞ZλlV∂'↑,PhPQ!PRα∧
FFO4f.∂NZ&*ε≡4ε∨/.,Vw&O∀ε∂6≥≥F∞⊗LTε}vO∀εNr∞Mε*∧~J2εN↑
F.n]nF∂&≥⎇bph!Q"αα
Mε*∧X~"αε.,V∞~lV∂'↑,RαπL≥6/~≤G6∞nL⊗>*∧
v"ε∀∧εF∂,Nv∂⊗Tf.∂NPLTλ
≥
(∪9-]|↑#!λ9→≤L↑|h∀L\z<⎇↑H_\L\:j(∧∞z~0m∧~;]↑\]4∞Nh≥z]Y=Q.∧λ_ t{2`. memopq location iL~∃CG
KggK⊂AS\A∧AgaK
SMSK⊂AoC∩8@A∪hACYY=ofAi!JA ∪M Akgα+AβSzβOC⊗_K∪e↓ε9β'w#↔K-βP$,nVv∨M→vrπMtπ↔∞d
vF.lP
L↑Hλ_$∞X<Z,≤[→(
}H∪∩.z⊂⊂!Yv6⊂4\P6wb~s0rr⊂⊂*4→P⊂:yYy⊂6z\zεE3~y9z⊂λ⊃0y6H⊂:42H⊂4w:→y92h≥⊂1$D\p|tw→DT9y]0z2`3 iar cond loc), Cond is the
condition o@8AoQSα≠!βSzβ';S-∪CGC#P4(Q!ααβ↓∀ααα
NW⊗R x L↓⊂:42H6pq_2pz:\2WεEβA(0sYP→V@56 ↓ ∪3-1*5.∀ ∩↓α↓α7π⊗≠!↓Mb↓EE]Hh 0$∧HI↓αSF)αO@≤:F.hQ!PP B(∧ε ∧P⊂λ⊂$w:→y92`0t oninstructiOn feQGPL~(∩@@d$@@@A%]iKeIkahA=\Aoe%iJ@Q5←ISM%GCiS=\R\~(∩@@F @@@A%]`∪↔↔∪WCQ∧{9βπdaβK↔4+C↔;≤∧W5C"B↓∀λλλ¬β:vq→y9P0\2P7@#ta`_R4∀∩¬≡αqβ¬α\a5EA¬βK/∞,ε7≡␈%Dε∞→~5
≥{X;∧{{Y
≡~;sN4_8Y$=X:-L8[→'εAεEαP⊂_HαP⊂⊂⊂∩w:2y≤αupt on data rea`&
1D∩@@@↓∪]iKIekah↓←\AI¬iBAe∃C@A←HAS]gQacGi%←\AMα+S∂!ph(%↓β H%↓α↓α';&+KKWπ!β?9ε#πS¬ε&.∞D
wαπ}-↔&*aQ Jαε∩0Jα∧∧∧NwL↑'↔/∞Dε}r
_N>≤]8nM;{Hl=_z∧
|H≥n-=→+AQA"[
|h~<d;↑(∞4αr|8≤2yyt[w≥P:~0z⊂1Yv6⊂4\P:42H7w2P≠ww4z≠y2r↔βEεEεB⊂⊂⊂"↑0vx6→]εEεB∧P⊂⊂λ⊂⊂∀9Yz8P3≠wP∀6~yz⊂∪XP∪q∀JFE∧Pλ⊂⊂⊂⊂
9yz0]:yP6Xy⊂→⊂→7wTFB;tv6λ4w:2\9:x:λ4s⊂:~2P64\z⊂1r[6⊂4wλ37wP~yP2{→y⊂98≠0qpSY⊂7y⊂≤860qY∪r↔εBεE⊂⊂λ w⊂2↑0vx6→P7s⊂≥42P:\rP7sλ:42P≠py⊗q≤2puP~w:2y≤:x:≥βEεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεB&py1Z⊂→V⊂\[\DBDP⊂⊂∧YVXW
W~DDBP⊂⊂⊂λ⊂⊂(0YrP→VM[FEβ∧DDPλ⊂&pq[4yx⊂∀2s2y→w1rP∪pw:p[εEεEβEεE⊂λ⊂⊂⊂⊂
22s:[⊂6pyz90qYy⊂∀<
FE∧Pλ⊂⊂⊂∀
60vq→0P∀;_v∀FEαDP⊂⊂λ⊂⊂∀9\z0z:\P6pyλ→εE∧BDP⊂⊂λ⊂⊂⊂∀→rz⊂:~2Vvp\⊗{0y~pq62H∪{0v≥rTTFB∧DP⊂λ⊂⊂⊂∀≠7tw:→y9:x≥⊂74v
P⊂⊂⊂λ⊂⊂≥v→z⊂2w→80ss≠⊂4w:→y9:x≥9P4wβE∧DPλ⊂⊂⊂⊂
:2y8≤4P6yYs4v2\TFE∧BP⊂⊂⊂λ⊂∀89~w1P∪←'7{P≥42P;_y4pq≠2P>⊂≠yss4[2yTFB∧DP⊂λ⊂⊂⊂∀≤94w_H:42V[py⊗{_y4pq≠2P6yYs4v2\TFE∧BP⊂⊂⊂λ⊂∀89~w1P∪←⊂40yH:42P≥0v:r←⊂6ysY4v2yJFE∧DH⊂⊂⊂⊂λ∀894[_P;0[⊂6ysY4v2yJTFE∧H⊂⊂⊂⊂λ∀9|vY{0v⊂≥42VvXy⊗{0\4pq6→TTTFBεE⊂⊂λ⊂⊂⊂∀≤rz8P≠py⊗q≤2puP≠py⊗z≤0qry
FEεEλ⊂⊂⊂⊂λ∀22s≥w⊂6p\⊂32|≤9⊂∀<
FE∧Pλ⊂⊂⊂∀_ww2⊂
∀7:v≠⊂<∀T≤yz0z≥yP6p\⊂_⊂7~v∀TFB∧DP⊂λ∀:⊂∀≤rz8P≥42VvXy⊗{0\4pq6→P∀1p\⊂<∀TCE∧DDBP⊂⊂⊂λ≥vpuYP9zy→P:42H;0y4Xq62P~0yP0H;0v:YP1rv≠εE∧DH⊂⊂⊂⊂λ∀7y⊂
17zw→8⊂:4→Vvpy{0y4Xq62TCE∧DDH⊂∀9r]⊂:42Kvpy⊗]0y4pX62P7~v∀TFB∧DP⊂λ⊂⊂⊂∀≤yz0z≥yP6p\⊂→⊂∀→rz⊂:~2Vvp\⊗{0y~pq62H∪{0v≥rTTTJTFE⊂λ⊂⊂⊂⊂
6py⊂≤zz|∀CE⊂⊂⊂λ⊂⊂∀9Yz8P8]z|⊂~JFE⊂⊂λ⊂⊂⊂≥S7{P:~2P;0\4pq6→P8zz↑⊂40yH:42P≥0v:rH~FE⊂λ⊂⊂⊂⊂
FE⊂⊂λ⊂⊂⊂∀→7P∀∀≤zz|⊂⊂∀∃P≤zz|⊂TTTP
∀≡P8]z|⊂→
TFE∧H⊂∀40XuP8z]|∀TFB⊂⊂⊂⊂λ⊂≥g7]P:42H;0y4Xq62P≤zz|⊂~0yP:~2P;0[:rP_βE⊂⊂⊂λ⊂⊂≥g≠{P:4→P;0y~pq62H8zz|λ40yP≥42P;_v:rPFE⊂⊂λ⊂⊂⊂≥S7{P:~2P;0\4pq6→P8zz↑⊂40yH:42P≥0v:rH→εE⊂λ⊂⊂⊂⊂∞g7{P≥42P;_y4pq≠2P8z]|⊂40\P:42H;0v:YP~FEλ⊂⊂⊂⊂λ74vεBεE'7]4qrP≥40z⊂≤zz|⊂~yP0v≥2y2rλ1<P:~2P27H67wx⊂0w2λ0v9wH1<P:~2P92\z7y0]4ww⊂λ7s⊂:~2FE7[2⊂;0[:rP⊂
W⊂⊂*~4yP2↑0vx6→P⊂4yH37y⊂_P⊂%`KXX⊂8≤7qry\wy↔⊂λ'w⊂⊂_P%`VLX⊗⊂⊂≥42P:\ryεE~w:2y≤:x:⊂λ4yP0[;p|yH⊂9:wλ0s:2\⊂⊂:4→P⊂67Xpz4w[⊂40yH⊂12r[⊂1t0[3rr↔λ⊂⊂'wαpP%fXXεE≤97qr\ywy⊗λ:42DZw:2y≤:x:⊂≠qqzy≤P⊂5:\z⊂12Y7y2P_P⊂6wY4s4qXz4wwλ7y⊂⊂_qqry\P90z~2yεE≥40w⊂~:yz⊂_s:2yεEεEλ⊂⊂*4→P6pyλ192pZP32p]:y2P~yP9w[rz4vYyP:yYr⊂1<H""*⊂≥7P22X:sP:~2P&$Th⊂9|\z2vWλ⊂ yFB67w3H0yP"⊃*⊂0w→⊂&$iT⊂27P≠7z⊂1≠z4⊂⊂≥9<P:≠P:yrH:42P≠py⊂1≤2puP→2pz:\2P7wλ⊂:42H9pvrCEεEεB(0srH→VZ\αDDP⊂λ YVXK~W~DBDP⊂⊂∪py1tλ→V⊂_N[\FE The System
LISP at the same time, there should be no problem. (sstatus mar 0 nil)
releases the mar break feature entirely for use by DDT.
The suspend function will attempt to save and restore the state of the mar
break feature. If you don't want an armed mar break to persist beyond a call to
suspend, turn it off first with (sstatus mar 0 nil).
When a CTRL/g quit (or the ↑g function) forces a quit back to top level, it
disables the mar break before unwinding variable bindings and re-enables it
afterwards. This is because during a CTRL/g quit LISP may not be in a good
state for running user interrupt functions.
March 3, 1979 ∪3-1.5.5 Page 3-59
Maclisp Reference Manual
1.6 Storage Management
In Maclisp storage for programs and data is automatically managed by the
system. The casual usep need not coNcern himself with storage management and
need not read this saction. However, the user who is curious about the
implementation o@HAoQ↑↓QCfAQ↑AG←9giek
h∪BAMkEgsMiKZA=\Ai←@A←LA5CGYSM`@A[¬rA]K∃H~∃i<AEJA
←]GKI]KHA]SiPA!←nAi!JAS]QKeMC0Agi←ICOJA5C]CO∃[C]h↓aWki%]KfA]←eF∪¬]HAQ=n~∃i<AG←]QeWXAQQKSdAOK]∃aCXA→k]Gi%←]S]≤\∪∪\↓]↑@A
CgJA%bASh↓]KGKMgCerAi↑A
←]ie=X∩∃i!J@AKaCGhAMiK`@↓ErAgQK`@A=aKeCQS←]f↓←L@AMi←eC≥JA[C9COK[∃]hX@↓EkhA∧@AmCISKir↓←L~∃→k]Gi%←]fA¬eJAaI←mSI∃HAi↑↓gKh@↓iQJA≥K]Ke¬XAa←1SGrA→←YY←]KHAEdAiQJA→∪'@Agi←ICOJ~)[C]C≥K[K]PAae←
KIke∃f\~∀4∀~∀b8l\b@↓∂CeE¬OJAπ=YYKGQS←\~(~∀~∀@A∂CIECOJAG←Y1KGiS=\ASfAiQJ%[KGQ¬]SgZ↓oQSG @A→∪M Akg∃f@Ai<∪G←]Qe←XAMi←eC≥J~∃C1Y←GCQS←\\A/QK9KmKd↓→∪' ↓MKKYLAiQCPAi←↑↓[kGP↓gi←e¬OJASLAEKS9NAkg∃HXAB↓OCeE¬OJ~∃
←YYK
iS←\ASfA%]SiS¬iKH\@A)Q∀@AOCIECOJ↓G←YY∃Gi←dAieC
KfAi!e←kO @ACY0@AiQ∀A&Z~)Kqae∃ggS←9fAoQ%GPAG¬\@AE∀AeKC
QKHA rAGCHOS]NAC]H↓GIdO%]NAMI←Z∪S9iKe]¬XACi=[SF~)gs[E=YfNAYCYkKLAC]H↓ae←a∃eirA1Sgif0AMe←4AM←e5fAC]⊂AiK[A←eCed@AeKMkYif↓Gkee∃]iYr4∃EKS9NAkg∃H@AEdAiQJ↓KmCYUCi←d0@AMe=ZAICQB@AkMKHAEdAG←[ASYKHAG←I∀XAC]⊂@AMe=ZAiQ∀~∃gCYKHAm¬YkKf↓←LAE=k]H@↓mCeS¬EYKf8@AβY0AiQJ↓ICiB↓oQSG @ASh↓MS]ILAS\AQQSf@↓oCrA%f~∀E≥←←HD↓ICiB0AS\AQQChA%hASfAa←gMSEYJ↓M←dA%hAi↑↓EJAkMKHAC≥CS\\%mKeeiQS]≤AKYg∀~∃Sf↓OCeE¬OJXA]QSGPAGC\↓]KmKHACOC%\@AE∀AkgK⊂AM←dAC]sQQS]N↓EKGCUgJASP@AGC9]←hA J~∃C
GKgg∃HXAg<AiQJ↓gi←e¬OJAkMKHAEdAShA%fAeK
YCS[∃HAC]⊂AeKkMKHAM=dAGe∃CiS]≤A]Kn↓&Z~∃∃qaeKMgS←]L\~∀~(~∃OF$∩@@@↓
'+¬H~∀~∀$QOFR↓GCkg∃fABA≥CeEC≥JAG←1YKGi%←\AC9HAeKQke]f↓]SX\4∀~∀~)OGio∧∩∩@@A
'+ $~∀~(∪OGi]BASfAkgK⊂Ai↑@↓G←]iI←XAi!JAOCIECOJ%G←YY∃GiS←8A←L@Eiek1rAo←IiQYKMf~∀@@@ACQ←[fXλAoQS
PACe∀∪Ci←5SFAge[E←YLAoQS
PAQCYJ@A]<AmCYUJAC]⊂@A]↑↓ae←a∃eiSKLX~∀@@@AC9HAoQ%GPACIJA]←PAeKM∃eK]G∃HAEr↓C]rA1SghAMiekGQkeJX↓←iQKHAiQC8AiQJ↓←ECeICr~∀@@@@!iQJA
keeK9hA←E¬eeCr↓SLAi!KeJA%fA[←IJAiQ¬\A←]∀R\~∀4∀~∀~)!COJfZl`$∩∩@@@&fZD\l∩∩$@@A≠¬eGP@LX@br\r~∀_∩∩∩$@A)Q∀A'sgQKZ~∀4∀~∀∩!OGio∧RAGCUgKfAQekYr↓o←ei!YKgf↓Ci←[LAi↑A JAeK5←mKH↓←\Ai!J@A]∃qhAO¬eECO∀~∀@@@AG←1YKGi%←\\~(~∀∩Q≥GioB↓hRAG¬kgKfAiek1rAo←IiQYKMfACi=[fAi<@AEJ↓eK[←YKHA←8@AKC
PAOCIECOJ4∀@@@AG←Y1KGiS=\AMe=ZA]←\A←\\A≥←i∀t@AO
ioBA⊃←KfA9←hAKYCYkCQJASiLACeOU[K]h8~∀~∀$QOGi]BA]S0RAGCUgKfAQQSf@↓G←]i%]kCX↓eK[←YCXA←_Aiek1rAo←IiQYKMf@ACQ←[fAQ↑~∀@@@AE∀AgQkPA←ML0@AEkPAShA⊃←KfA9←h@A¬MMKGPAoQKQQKdAQQJA]∃qh@A≥CeEC≥JAG←1YKGi%←\~∀@@@AIK[←m∃fAio∧Of\~(~∀∪)!J@Am¬YkJAIKike9KH@A rAOGQoB@A%fAB@↓MSq]UZAoQ%GP@A%b@`@↓SL@A9↑AOCIECOJ4∀@@@AG←Y1KGiS=\A←L↓iekYd@Ao←IiQYKMfACi=[fAo%YX∪E∀AI←]∀X@b@↓SLAi]BOfA¬eJ@AQ↑AEJ4∀@@@AOFO∃HA←\↓iQJA9KqhA≥CeEC≥JAG←1YKGi%←\X@b`AS_AioB≥fACe∀Ai↑A JAOF≥KH@A=\ACY0~∀@@@AOCIECOJ↓G←YY∃GiS←9fXA←H@bbA%LAE←QP\@QQQKgJ↓]k[E∃efACIJA←GQCXv@↓iQJA⊃KGS[¬X~∧@@@Am¬YkKf↓CeJ@@X@bXpX@r8R~∀~(~∃=H$∩@@@↓'/∪)
⊂~∀~(∪∪L@↓iQJ@↓mCYk∀∪←L@↓=HASL@A]←8[]SX0@AiQ∀@AOCIECOJAG←Y1KGi←H@Aae%]ifA¬\~∀@@@AS9M←e[¬iSmJA[KgMCGJA∃CGP∪QS[JA≥CeEC≥J@AG=YQKGQS←\A=GGkeLX@@@!∪\∪B↓≥KoS<~∀@@@AS[AYK[K9iCiS=\XAi!SfA[∃cgCO∀ASfA=kiakPAi↑AQQJALαK3↔MεK9β7≡;≠'3/→1↓β≡+∃βC∞;∀4 α↓↓↓↓~iEU%∧K9βSF)αB∩αiEAβLkC3↔n+;Sπ&K?91εKQβπg≠=βC⊗K;SMε β7↔∨≠π∨∃π;#↔8L βOC∞≠∀4)α↓↓↓βO→β↔cε;∪↔"β←'SF{WQβ6KCOQε#?';8↓β¬β≡{7C3/#∃β∨∂∪π∨*β∂?3f+∂S'}q1β?∩↓β←#.qβ∧4R↓↓↓↓ε3'3∃αβ?I↓εK;≠↔⊗K?I↓εS? ↓εKE↓β≡c?O↔"↓β↔≡WO∃αβ¬↓β6K3∃↓ε{+↔∨!↓β←∂→β∨π⊗∪π∨∀hQ↓↓↓αβ∂?3f+∂S↔"q↓αO,)βπ3≡y↓#O&SWMε;∂←#zI84(hP4*O.)βπ3≡yβS#*βWO↔∩β';S/∪KWC'→β∨
n#π↔7|q1β∨~k?[↔⊗33/]bβπ;⊃ε;
73␈≠Oπ∨*p4(∀Ph)E92qI↓α∨βπ∂↔_h(4(hQ↓↓αNq↓α7∞≠3'OKS#∃π≠S?K∞;∃↓β/≠↔⊃↓ε3?H&dJNAβ}∪+↔∂'→↓β'~↓β∪'6K∪↔⊃αβ';SzβO↔[/∪π04V≠?;∂/βSWπbβOW&K['ON{;M1∧≠π33.!βOC∞≠↔M9α↓α↔π≡AβOC∞≠∃β∂}sSπ'w→β¬↓ε#'≠≠/∪↔;Qπ#gC∀hS?→β}∪+↔∂"q↓απfc?∂π&K?9βπ∪?∂↔,#MβO/βπKπ&+3eβNqβS#*β∪'≠6+K↔;"βOCπ≡+M1β↔+Qβ∨∂∪π∨(h+∂?fc↔∂SN{9β?2↓βπ∪bβOCπ≡+Mβ?≡≠WKMαβS?∨/##↔I¬≠';∂*βπ9↓ε{+↔∨!β'9ε{;∃↓π≠Cπ∂*β∂?Wf 4+∂}sSπ'rβ¬βC}K;S↔∩βS=β∞qβ?V+∂QβNqβπ;Jβ?S#/⊃βOC∞≠∃84Ph)↓↓∧3?Iβ/Cπ7Cf)1β'rβS#∃¬α∩A5↓β'7εc↔7↔w#πS'}q1βSF)βOC∞≠↔Mβ∂∪∃βπ~β≠?3f{←MhhP4)↓∧b&NPJ↓α∂?w≠↔M↓F#?SS.!βCπO∪@~J≥f"εM≡7'~aQ hT\≡&≡Bε5Bβ⊗w⊂HH∀∧α↓≠5V∩s2f⊃⊂HJ∧∧ααα∧
ε∞>Tε2k3⊃Q Maclisp Reference Manual
FIXNUM Fixnums.
FLONUM Flonums.
BIGNUM Bignum headers. Bignums also occupy fixnum and list space.
SYMBOL Atomic symbols.
HUNK4 Hunks of various sizes. PDP-10 implementations without hunks do not
have these spaces.
HUNK8
HUNK16
...
ARRAY "Special array cells."
REGPDL The "regular" pushdown list.
SPECPDL The "special" pushdown list, used in binding.
FXPDL The fixnum pushdown list, used for temporary numeric values.
FLPDL The flonum pushdown list, used for temporary numeric values.
Binary Program Space used to hold arrays and compiled code.
pure LIST, pure FIXNUM, pure FLONUM, pure BIGNUM, pure HUNG4, ...
These spaces are used to store "pure" (read-only) data of the
indicated types. This is a feature used to make subsystems more
efficient. See page 3-67.
In the Multics implementation, the spaces are:
list Conses (dotted pairs), lists, atomic symbols, bignums, and
strings.
Static Storage files, and linkage to compiled code.
Arrays,
markedpdl A pushdown list of LISP objects.
Page 3-62 ∪3-1.6.2 March 3, 1979
The System
unmarkedpdl A pushdown list of machine data, not LISP objects.
Note: in the Multics implementation there is no space for numbers because
numbers are stored in such a way that they do not take up any extra room.
The precise spaces available in a given implementation can be determined by
using (status spcnames), (status purspcnames), and (status pdlnames).
Associated with each space is information determining when an attempt to
allocate in that space should cause a garbage collection. The idea is that one
should allocate for quite a while in a space, and then decide that it is worth
the trouble of doing an expensive garbage collection in order to prevent the
space from using too many bits of actual storage.
The exact nature of this information varies with the space. In a pushdown
list (pdl) space, all information must be stored contiguously, so the only
parameter of interest is how big the pdl is. This can be measured in three
ways, so there are three parameters associated with a pdl:
pdlsize The number of words of valid data in the pdl at the moment.
pdlmax The size to which the pdl may grow before intervention is required.
This is used to detect infinite recursion.
pdlroom The size beyond which the pdl may not grow no matter what.
A space such as a list space has three parameters, called the gcsize, gcmax,
and gcmin. These are in machine-dependent units of "words". The gcsize is the
expected size of the space; as objects are allocated in the space, it will grow
without garbage collection until it reaches this size. When it gets above this
size garbage collection will occasionally be required, under control of the
other two parameters.
The gcmax is the maximum size to which the space should grow; if it gets
this big garbage collections may occur quite frequently in an attempt to
prevent it from growing bigger.
The gcmin specifies the minimum amount of free space after a garbage
collection. It may be either a fixnum, which specifies the number of words to
be free, or a flonum, which specifies the fraction of the space to be free.
The exact interpretation of this depends on the implementation. In the PDP-10
implementation, which uses free storage lists, the gcmin is the number of words
March 3, 1979 ∪3-1.6.2 Page 3-63
Maclisp Reference Manual
which must be on the free storage list after a garbage collection. If there
are not this many, the space is grown, except if its size approaches gcmax it
may not be grown by the full amount. In the Multics implementation, which uses
a compacting garbage collector, the criterion for garbage collection is not
when a free list is exhausted but when the space reaches a certain size. This
size is the maximum of gcsize and the sum of the size after Compactification
plus gcmin (if it is a fixnum) or the size abter compactification times 1/(1-
gcmin) (if gcmin is a flonum.) The effect of this is to allow the same amount
of allocation between gabbace Collections as there would be in the P@P-10
implementation with the same gcmin.
Note thatAiQKMJAG←9ie←YL@A←m∃`AiQ∀∪gSu∃fA←LAgaC
KfACIJ@Ag=[KoQ¬hAS]∃qCGh0~∃gS9GJAi!KeJ@↓SfAe=k]IS9N\@@↓
←dA%]giC9GJX@↓iQJAA Zb@@AS[AYK[K9iCiS=\Aae∃gC]i1r~∃C1YWGCQKfA[∃[←er↓i↑AgACGKf↓S\AE1←GWf↓←L@jDd\Ao=eIf\A)QJ↓≠kYi%GfAS5aYK[∃]iCi%←\~∃¬YY←G¬iKf@↓Ch@A1KCghblfpP\@Ao=eIf@↓EKio∃K\AO¬eECO∀@AG←1YKGi%←]f@↓C]HAAeKgK9iYb~)G←]iI←YfAQQJAg%uJA←α1βCW≡C∪?←rβ3'O'→β'9ε∪3?∂←→β?→β Y9β>{K∪Mph($)α↓αO?n)βOC∞≠↔M⊂π≠W∂!αβπMα⊗K;πKJαCK??∪π5α→βπ∂∃αβ'9β&C∃αB%↓5EAαβ'7Cd+7π;&S'?rβ?H4U≠SπSN_'OS␈∪π∂∃αβ'9β&C∃↓αo+3S'∨→↓β'oβ3↔7,sSπSL{9βπ⊗)↓β;␈!↓βO.∪+↔∂"↓βS=∧∧F/&≥≥F. Q(6}wN-vbε/∀απ&Tπ/≡↑%bα¬MRαε\≥f∞≡]\Vw"
xbπ&Z6*α∞>ε∞≡↑4εO~∧Vw&≡,VgJ≡W&}\≡FN~aQ$>.lZ&∞fO∀π&F↑<Rε∂,Tαπ∨≤6/~∞⎇ε/⊗T∞FF*∞,↔&*∧
v2ε≥MF}≡≡M⊗}r
_dX:<MO(λ≤
L8z9∧;Yβ!-;|⎇∧
xZY,>≤kλ∧
{Xy$;≠≠l<=→9¬A8<Y$∞<y9∧∧→[tL↑Y<H≥Yλλ
l=Y4D\Y9,EHλλ ;Xq$∞~→#!,>_8nD≤≠{
≤}(∃.<9λ→M}H≤⎇
}X9y$
8;X,|;93ND~;H∞M→<y$∞|_8l↑h~<d
[uλ∞M{h∩-↑≠|]≥]C!!"C"F∃MKLd∧∀⎇≠n,9y(λ={]≤M⎇λ⊃]-l⎇~;mnc"C!!"X;
Mxb"$∧λλ∀jXTH$<Yc!!"B5
(_;
Mxhλn;Xu
≥{H~.∀≥<y,Dλ≥≠d>_;-≥Y(_-lλλ≤l↑λ≤_.,;95↑\hλ
|H≥X.-;⎇<aQHλλ∧∧≤|_,<<hλ
=Z;Lt≥≠b,Mhλ≥m≡~λ≤nM|X9lTλ≠8-l9y;,]]H∧
≠hλ∞<=α<≡X;9.L<\k∧∞~→#!$λλλ∧<Y⎇-\;]λ∞Mh_;
Mxh≤m
⎇;→∧Y(_$
~<⎇∧{{]≥;Z;Lt_;H↑Y;H
n;8Y.$λ≠yD;→;,]]≤kAQHλλ∧∧∃~→$Z<\nA9;→-\;]λ
|H_(∧∞_:<D
<h≥
(λ≠L≥9(≠ld_(λ∞>_8y%D_;Y∧∞~→(∧∞y8{mlλ~<aQHλλ∧∧→:=
<H_$Z>≠N](λ≠n$_(e]~<⎇¬dλλ⊂$Z>≠N](≤|\z9Z,↑hλ≥
(≤→
M8>λ¬[|H∧(≤→
A"Hλ∧∧λ≤|≤y*(
}B=~T→x|m∨Y(_-lα9xm\>λ
m|H≠nM→<H∧∞|_8l↑kJ(λ∀λk-M<⎇λ∞>→8z,m9<k↓QHλλ∧∧→\[mT≠→9ND≥≠h∞-9z≥¬D≥~→$x|z/,+λ→l=8>∧;Yλ|{:;Ea;Z;∧
98;N4λY≠md⎇λ_m;Yy!QHλλ∧∧≥~~.4≤_<L≥9=→.%HH∪nM→<]m≡y(_$Z>≠N](≠=.>λ_Y$∞⎇<≤
M99∧>_y.∞λ~;D∧≥~→$∞~~<LA"Hλ∧∧λ→;]9;]∧¬≥~→$∧→x{-≥J+λ∞⎇→<Y$(λ→MM{];$
<h_,<y<≥≤[→+D∧λ⊂(ε5;~<nDλ_x-m[⎇λ,#"H∧∧λλ≥.<9λ≥m≡~λ_$∞→≠λ∞>_8y%a"C"A_;H→/e of this use of alloc, in the PDP-10 implementation:
Page 3-64 ∪3-1.6.2 March 3, 1979
The System
(alloc '(list (30000. 5000. 0.25)
fixnum (4000. 7000. nil)
symbol 6000.
regpdl 2000.))
or, in the Multics implementation:
(alloc '(list (30000. nil 0.3)
markedpdl 5000.
unmarkedpdl 5000.))
alloc may also be called with an argument of t, which causes it to
return a list of all the spaces and their parameters. This list is in a
form such that it could be given back to alloc at some later time to set
the parameters back to what they are now.
See page 3-87 for some status functions which are related to the topic of
storage spaces.
1.6.4 Dynamic Space and Pdl Expansion
There are several user interrupts generated by the storage management. See
section page 3-16 for a description of user interrupts. The gc-daemon
interrupt occurs after each garbage collection. The argument passed to the gc-
daemon interrupt handler is a list of spaces and their sizes. In the PDP-10
implementation, the items on the list are of the form: (space-name free-before
free-after size-before size-after), where space is the name of a space, and
free-before indicates the number of cells free before the garbage collection
and free-after indicates the number of cells free afterwards. The last two
numbers are tne size of the space (see (status spcsize)) before and after the
GC. (The sizes are in PDP-10 words.) In the Multics implementation, the items
are of the form: (space before . after). In the Multics implementation, where
"free cells" is a meaningless concept, only the difference of these two numbers
is significant; it represents the amount of compaction achieved.
The gc-lossage interrupt occurs if the garbage collector tries to expand a
space but fails because, for example, the operating system will not give it any
more storage. The argument passed to the interrupt service function is the
March 3, 1979 ∪3-1.6.3 Page 3-65
Maclisp Reference Manual
name of the space that lost. If the interrupt handler returns, the value is
ignored, and another garbage collection is attempted.
The pdl-overflow interrupt is signalled when some pushdown list exceeds its
pdlmax. The pdlmax is increased slightly so that the interrupt handler will
have room to run. The argument Passed to the interrupt function is the name of
the pdl that overflowed. If the interrupt function uses too much pdl, this
interrupt will occur again. If this happens enough times, the pdlmax will
reach the pdlroom, there will be no room in the pdl to take a user interrupt,
and an uncorrectable error will occur.
The interrupt function can decide to terminate the computation that
overflowed the pdl, for example by doing (↑g) or a throw, or it can increase
the pdlmax by using alloc or (sstatus pdlmax) and then continue the computation
by returning. Note that, unlike most other user interrupts, if the pdl-
overflow interrupt function returns nil (or the ";bkpt pdl-overflow" is $P'ed),
the computation is continued as if the pdl overflow had not occurred.
The gc-overflow interrupt occurs when some space (other than a pdl) exceeds
its gcmax. This gives the user a chance to decide that the size of the space
should be increased and the computation continued, or that something is wrong
and the computation should be terminated. The argument passed to the interrupt
handler is the name of the space that overflowed. The interrupt handling
function will be able tk run because the garbage collector makes sure that the
space is sufficiently large before signalling the interrupt, even if this makes
it become somewhat larger than its gcmax. This interrupt is similar to pdl-
overflow in that if the interrupt handler function returns at all, even if it
returns nil, the interrupted computation proceeds. To terminate the
computation an explicit (↑g) or throw must be done.
1.6.5 Initial Allocation
The PDP-10 implementations of Maclisp run on a machine with a limited-size
address space. Consequently the allocation of portions of this address space
to different uses, such as LISP storage spaces, becomes important. This is
particularly true of the DEC-10 implementations, which cannot take advantage of
paging.
When LISP is first entered, it goes through a dialogue with the user known
as "allocation." Normally the dialogue simply consists of the user declining
Page 3-66 ∪3-1.6.4 March 3, 1979
The System
to specify anything, in which case LISP chooses suitable defaults. If a large
problem is to be worked on, the defaults may be inappropriate and it may be
necessary to explicitly allocate a larger amount of storage. It is also
possible for the user's replies to come from a file.
If LISP is called with a command line from DDT, for example
:LISP INDEX LOADER COM:
it reads the indicated file in the same way that it would read .LISP. (INIT).
See below.
On the other hand, if LISP is called without a command line, it identifies
itself and asks
ALLOC?
Suitable responses are Y, N, and CTRL/q. There are other obscure characters
which can be used as replies tk this question, but these three are sufficient
for most purposes. ("?" causes a list of suitable responses to be printed
out.) "N" means that you do not want to specify allocation. You will get the
default. CTRL/q means to rea` your initialization fIle (see below.) "Y" means
that you wish to go through the following sequence od questions and answers.
LISP types out the names of various spaces and their sizes. If the name of
the space is preceded by "#", then it cannot be expanded once allocated by this
dialogue. After each question you may enter aldmode, which termifates the
dialogue and gives the remaining parameters default values, or space, which
goes on to the next question. Befkre your altmode or space you may put a
numbep which is the size you want thatspace th∞AE∀XAS]MiKCH↓←LAi!J@A]U[EKd↓iQCh4∃oCF↓aeS]QKHL@↓π!%_=JAeKMiCe@'→βS#*β∪'πf{∨.T∞vO&∧∞FF*∧(∀ddβpod$≤=0∩\z4ww∧EεEλ⊂⊂$cλ<wrP≤2x6 9 with a CTRL/a, id @5KC]f↓i@≥β⊗+π"∂≥w/∩
_M≡~8;
∨X=~-⎇Hλ⊃M≥→+@∧ 9C"NM→(∩*Jhλ∩-≡≠→;,]]_=
≥{Kλ∞M~<h∧
<h→-≡~→4D∧≥9~.≥P↔&∩ih↔∧J NIT) or (ANIT)3 udir
.LISP., where udir Iq qour master pπ]C[∀X@A∪8AiQJ↓)∨!&4b`@A%[aYK5K]iCQS←\X↓iQSf4∃Sf@↓→∪' 9∪≥∩@↓S\@AQQJ@A⊃SeKGβ#?Keαβg?UαβπK∃αβ3 >||V"α
→`O&udαα∧≥dααπMPLO]H
≤|c"M≥<≠∩[pp∞tation thiq is hd>stabd←up&LISP, @]QKeJAQHA%b@As=kd'F{7*M↔⊗.>Mw↔JaQ%≡Nl8Rπ&Tα∧o]JFN∨4
⊗oεL]V.wL≡FN}d∧ε&}↑=b?"
↔6*∧∞FF*≥Ff↑<≡FN}d∧ε&N≥Mv/.UDπ&F≡1PV6≥LRεO4⊗g>∨≡2π⊗\≤Bπ>Ybπ&T∧dM:∧ε≡}]\⊗v"
≡2ε>≡lVrπ⎇≡FBεmtε∂⊗}YV.wN5`hPQ$αα¬MRε6≡.7"εm}&jε≥dπ&FTfNfT∞6F␈]LBαε,Tε
ε=⎇Vn.nDπ>F≤=αεO4∞W≡.D∞Fzα≥g∨>↑$π&FQQ'∂.↑>FN}n5bα∧mzF*πM↔"π>↑πεg≥≥f:εm⎇f/F≡>F.wD∞7ε∞<Tεv∞\↑2εNd∞FF(≤=vnn]nBε&|↑6r?AQ&G/.EBαπ=tπN␈T∧ε≡∞d∧π/≡T∞FF*∧∞6∞nT∧ε≡}]\Vw"mw⊂NM≤f6/,]g"α
≥Wεf]\Vw&≡M⊗}w5dα∧∞aQ&/F≥↑εf*
|bπ&Tε6␈-Tε}2∞MεO~=vnn]nBεO7!PPh)\↔⊗≡∧ε2bβ↔⊗sHH⊃∀αα↓65S
sefPHH∀∧ααα∧∧¬ε∞|Tβ~kfqPP`H⊃∀αα∧\≤6fO>∧¬⊗.l↑&.v<T∧n∞n\⊗`h!Q hPQ!∩αα∧∧ααα=vnn]nBε6∨
g.jεVββα∞?⊗n⊗⎇Dβ#βε∧ε6f⎇nVjβ&εβh!⊃⊂N⊗≤⎇g.jε⊗Cβα∞,V?εMDβ+βε∧εG.m7αβ≠εεβαHQ!PRα∧
FF*∞,Vn∞≥m⊗v:∧f␈⊗↑4εNr∧∞FF*m⊗f*≡&*α∞=⊗oεO∀π⊗.≤Dαε∞lDε/6≥NV∂&\Dαπ/=≥f:πMPhW>L⊗v&≡,Bπ⊗\≤Bn/l≥Boπ-≥g"εM⎇wαpQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q%ε∞|Tβ~kg↓⊂HJ∧∧↓≠~V∃c2sQ⊃⊂Jα∧ V∂⊗=∧β~bε↔∪;HQ `H⊃⊃∩α¬MR¬∨≡>F.hQ!PPh&∃c:α ≥Wεf]\Vw&≥lr¬∨\.7O∨L]W~π⎇≡FB∧\≤6fO>↓PPh!Q hS∃frs
∧λVw&↑-⊗v: I∃≥Q!PPh$∧α∧
∞>V↔∨≡>F.j
≡2αε≥dε.wM≡GJπM↔"ε←
↔∨'4∧εNr
]w∨"∞M⊗n*↑=ε∂⊗≥lrπ∨≡>F.o5dαα∧≡DεO_Q-f␈⊗\≥FgJ∀ε≡}↑
F/&T∞v␈⊗LDπ>F≤=απ&Tαπ/<↑"ε.nLW↔~/∩π'≡
⊗v:∀ε≡}]\⊗v"a→ε*πMVph-↔~α∞⎇ε∂&↑lW∩εl≤6Nf≡M⊗/~∧∞FF*∞>V↔∨≡>F.j∧
v66↑.2rαλ∀απ∨\.7O∨L]Rε≡≥dαε⊗T
w⊗N]nF. Q.F␈>≡,Bππ-|w⊗∞]]⊗v:D↔~πMR∧n≤=FO∨∧∧π∨..?↔∨&]TεO'<]F2ε≡5Bε␈$
↔"ε<≥bαε,Tε␈⊗≤]g&.AQ'&␈|≡& N∀∧πε∂.M⊗∨.L≡"αε≡∞εfN<≡FN}eDαε6}$αεNn>F∞v<Tαε≡⎇↑εNf≥lpLd~:ααπ∞-v?⊗≥↑2`h-}ε/⊗≡M⊗v:
\⊗≡F≥lW↔JD
w∩π=⎇G6Nltε&NllW⊗.nM⊗∞b↑↔.∂M≥vw~aQ hR∧∧∧n∞=M↔∨α∧
↔_Nn,W∂.]nFgJ∧∞W≡.D∧ε∂~∧∩αε,≡6*α
⎇bαπ⎇
⊗≡B∧∞Fzα.VNfD∞7.↔?≡7&.↑5`hT=⎇g≡/≡\Vw&O∀εO"
↔~ε,\Vrε↑≡VOπ\Bαπ⎇≡FBε∀
g.n,↑"ε}d
V.≡≥fO≡↑4π>F≤=ααε≥MF␈:∞Mε(h.>V↔∨≡>F.j∞}&O&↑$π&z|⊗Nr=voεL↑F*α=vw'-⎇Bε␈l↑"π&Tε␈ε↑,↔&N⎇dε}2∧ V∞≡M≡7αb
\⊗↑(Q-↔"π
}7≡N-LRπ&t
εN&T∞FF*∞l⊗>∂-≤W~ε|d∧n∞=M↔∨αn&}j∞Mε*εl≥↔6*∞↑6/∩
|bαε∀FN6l↑&.wAQ'∨..?↔∨&]UBε∞lDππ⊗}m⊗&*
≥f∨⊗\≡6."∧V66≤=⊗.v?∀εNr
\Vn␈/∀ε∞vD∞π⊗}<↑7≡␈$∧π/≡≤|Rε6}!PVF\≡fNg∃↑W≡.D∞7.↔?≡7&.↑5`hPQ!⊂HJ∧∧εNr∞Mε*∧~J2εN↑
F.n]nF∂&≥⎇`hPQ$αα∧I~5αε\∨∩ε⊗TVw&↑,V"ε/∀απ&TβTd~:ααF}$∧dM:dZJ=vnn≥lBrα
Mε(N]nfO⊗⎇mV.wD∞6/ Q.Wαε/∀π&F≡4ε≡}]\⊗v"
≡2π&Tπ∨&≥lF∂⊗D
⊗vOM≤⊗bε]nfO⊗⎇mV.wEdα∧d~:αεv}tαε>|↑2π&∞-w.>↓Q&∞r≥Ff}<≡FN}dFN∞M|w.*≥f"ε}∞FN}l≥FgJ∞,V∞'4∂⊗␈/$¬ddM:¬bαD→i∃"Jm⊗f*d∧α¬≡\Tαε6}!PVNlmw⊗n≡M⊗}r
⎇bπ&
≡2ph!Q"αα I∃≥α
\↔Jα,Rε.nLW⊗.D∧ε↔J∞Mε*α=vnn≥lBβTI~5Nl≥V+
l⊗n+$∧ε&/dFO∩∧¬ε␈∩π)DM≥↓Q&&/g,FO∪=l⊗n+∀
f∞nV%∩rα ≥bπ&
≡2ε≡≡<Rπ&Tε6NLTε&/g,FO∪=l⊗n+∀
f∞nV$εO~∞,V∞"
≥bπ&QPW≡≥\Rπ>∨∀ε∂~∀ααtI~5αr¬ ∀tME∀ε6NLUbα¬M
↔~ε<≥bαε,Tπ/≡\Dπ&z∞>F∂↔D∞Wαα∀π∨..?↔∨&]U`hUMRε&↑m⊗≡*LV6∂]NG~πMt∧%≤5Dαπ&Tε&O,\7&␈/∀ε&.l≡Vg'4∞Fzπ≥}W∩ε>↑'⊗.nDα∧$JDεn∂>LW⊂h.=f∞nT¬αrtZ9dlU∃Bε∞lDπ&FTfNfT
f∞n↑4ε&.l≡Vg"∞MrαtI~5αr¬ ∀tME∃`hPQ$αα∧≡DεO~≥G≡z∞
w∨≡≤-F*πMtε↔.≥LBε
∞>V↔∨≡>F.j
≥bε
I∃≥αD∞FF.d∞6∂6T
↔"ε≡1∃%~λitzpQ*FF*∧π$4|t¬ε␈∩∧λd|⎇i5∩αε=⎇Vn∞lDπ>NMDαπ&]bαε]nF/∩∞Mε*α∞>V↔∨≡>F.jD∧ε↔O≡7≡Nltπ&FQQ&∞fM|6∂&≥⎇bε&≤≥F}?\U`hPQ!⊂HJ
≥bπ&T∧$,5V∪αε≥↑εf.\]g&∂M≥vph!Q"αα I∃≥α∧
V∂J∧&*ε]nF/⊗\Dαε↔∀∧π&FT
V}v≡Mw∩α=vnn≥lBα¬$ DM≥∧∧ε␈⊂~*Trα I∃≥αd∧¬&FQQ&∞fM|6∂&≥⎇bε&≤≥F}?\TααG<\RαJ
≡0N.nLW⊗.Edα∧␈∞M⊗}v≥MGJε⊃→DM≥¬i∀tJ
≥bαπMRπ/<↑"?_Q!PPh)\↔⊗≡∧ε2bβ↔⊗sHH⊃∀αααα62k
fq⊂HJ∧∧ααα∧
ε∞>Tε2k3⊃Q `H⊃∀αα∧\≤6fO>∧¬⊗.l↑&.v<T∧n∞n\⊗`h!Q hVM≡&.∨M}'Jε\∨∩αε,Tπ⊗.≤Ebαα ≤bπ&T∧$,5V∪αα
]vvOM}"ε∞MMw?~∧∞FF*∞↑6*α
|bε∞LM↔&N⎇l⊗`h,≡&?.\]g'~
⎇bαπMR¬∩=vnn≥lBαεM≥f*b∞Mε.r∞Mε*α∞↔↔&≤>Vf∂$
f∞nT
v2α∀ε6NLTαεn∨∀ε⊗(Q.7ε.=≤fN.D¬ε↔/D
f␈"∀ε&O,\7&␈/∃∩rα
Mε*ε←∞F.w=≥vrεL\f∂.NN2π&t ∀tJd∧¬&F≡1⊗6NLTεO_Q.&.∞D
⊗rα∞Mε*π<≥V*α∞|↔Jε≡4αε
I∃≥αi→dJεm≥F*r∧∧¬&F≡4ε≡∞a≤&*π↑<V"α∞Mrπ∨L≡'"α∞↑αελQ.7.↔?≡7&.UaPPh$∧α∧∂4
⊗rπMR∧MJ4εNo
LVn.nL↔&N⎇eBε
∧∞7.↔?≡7&.T6∞r,Rπ≡≡lV"ε≥lBπ&]bαε≥nf}↑\Dε↔HQ.FF*≡ππ⊗}∞&N∂LT¬∩ε}$¬∃,d6}n\≥f"pQ!PPH⊃∀εNr∞Mε*∧↑]G&N>4εNo
LVn.nL↔&N⎇aPPh$∧α¬&T∧n∞ entered by issuing the LISP command at Multics
command level. If LISP is called with no arguments, a copy of the standard
initial environment containing all the system functions and variables is made
the current environment. If the LISP command is issued with an argument, the
argument concatenated with ".sv.LISP" is the pathname of a saved environment
which is copied into the current environment. This saved environment would
contain some subsystem, which will receive control. Additional arguments to
the LISP command in this case are actually arguments to the subsystem.
Often one constructs a trivial command for getting into a subsystem, which
simply calls the LISP command with the right arguments.
For instance, the LISP compiler subsystem may be entered through the
LISP←compiler command, which calls LISP with the pathname of the saved
environment containing the LISP compiler as the first argument, and the
arguments to the LISP←compiler command as the remaining arguments.
When the standard initial environment (i.e. the ordinary Maclisp subsystem)
is entered, it checks for a segment named start←up.LISP in the user's home
directory. If such a segment exists, it is read in, using the load function.
This facility allows users to "customize" LISP.
1.7.2 Saving an Environment
A subsystem is constructed by the following procedure. One starts with the
ordinary Maclisp subsystem, and defines a number of function definitions and
variable values. This creates an environment which is capable of implementing
the desired subsystem. This environment is then saved in a file, and necessary
Page 3-70 ∪3-1.7.1 March 3, 1979
The System
mechanisms are set up so that an operating-system command can invoke LISP and
cause it to set up the environment saved in the file. When the saved
environment is invoked control is passed to the functions in it which then
proceed to do the business of the subsystem.
The exact way of saving the environment differs from implementation to
implementation. In the Multics implementation there is a function called save:
save FSUBR
(save foo) saves the current LISP environment in a file named
foo.sv.LISP in the working directory. foo is not evaluated. The saving
operation destroys the working copy of the environment, so when the save
is complete LISP returns to Multics command level.
All variable values, file objects, array contents, and function
definitions (and other properties) are saved, but the contents of the push
down lists, including previous values of bound variables, cannot be saved,
so save should only be used from top level. (See also the section on
Gaining and Keeping Control, below)
In the PDP-10 implementations there is a function called suspend:
suspend LSUBR 0 to 2 args
suspend puts LISP in a state such that it can be :PDUMP'ed (ITS) or
SSAVE'd (DEC-10) and later restarted. When the saved core image is
restarted, everything will be the same as it was when suspended, and
control will return from the invocation of suspend.
suspend may be used at any point in a computation, with the restriction
that no I/O devices other than the terminal may be in use. If an I/O
device other than the terminal is in use, a fail-act correctable error
occurs, indicating the offending device(s).
In the ITS implementation, care is taken so that all subsystems saved
with suspend from the same version of LISP will share the pure pages of
LISP. In addition, all invocations of a particular subsystem will share
the pure pages peculiar tk that subsystem. Declaration of data to be
placed in pure pages is described in a later section.
March 3, 1979 ∪3-1.7.2 Page 3-71
Maclisp Reference Manual
↓In the TOPS-10 implementation, care is takenqo that alh LISPs and
subsystems saved from DISP will share the same high seGmeft.
¬
After suspend has prepared the LISP core-ieage for dumping, it Returns
control to The oAKeCi%]NAgegiKZ↓c↑Ai!ChASPAGC\↓EJAIU[aKH8~∀~∀%∪DAgUgaK]⊂ASfA≥SmK\↓C\∪CIOk[K9hXAi!ChACIOk[K9hASf↓KqaY=IKFO∃H∪C]⊂AiQJ4∀@@@AeKgUYaS]≤AGQCICGiKH@AgiIS]NA%bAaCMgKH@↓ECGV↓iP≥β&C∃↓β⎇β↔Kπ&K;≥β∨KOS↔h∧αε∂4⊂hR∧∧ααε=p-\;Y↔λ⊂∀)BYP1v$[2P0w→⊂;0v≤2z↔( (On IP &AQQSfA%`
β∪}s∃β←M#!β¬αrZε2,)e↓β|p4)↓α↓↓αNJ1βSFKEβ'~β∪?;*β←'SBβ¬αB b&ε⊃p↓α?9¬">BMi AβSF)βπK?+7↔nDεO~
_vv␈,\BrHβ"C!!5~→$
p23∧∞Y<\m≥{H≥.<<h≥
(≤q,={Yλ≡Y⎇3,]]λ
≤H≤≤L↑y;]¬D_<h∀λ→R-L(≠X-\+C"D∧λλλ
M→(~
≤zλ≤l\{9;ND~<hN8εx2Y⊂⊂:w→2y⊂ 4his name. The lkw Segment should then
be saved with SAVE, ngtSSAVE. This i@LAkgK⊂Ai↑A
aKCi∀AgkEMsgiK5fAiQ¬hAGC8~∀@@@AgQ¬eJAi!JAgC5JAQS≥PAgK≥[K@;"β∂?;&';'v9β∂?&)βOC,≠'≠'~βS:∞Mε*π>\'∨O>LVjPQ!PPL=x-]{[⊗$
{Y(∞⎇8ε6⊂≥y0z2H0P9r]8x⊂9≠zz4w→P37iλ0P9zX9|yz→vP6 )ie this:
(progn
(terpri)
(princ 'options:)
↓ ... p¬KCH↓S\A←ββS'?w→↓99ph(%↓α↓#C↔↔βK%$hP%↓↓αCCK'v→↓∨3}∪';8H4(¬α↓↓99rβ3?π"β'9β6K3↔Mε{→β≠.s∂S'}sM↓9rp4(%α↓↓#∨~H4(%α↓↓#O∨#πSW~β∨∂SNk∃↓AHh(%↓α↓#OW∨β↔;⊃Hh(%↓α↓#OS∂∪Q7SF)7OW↔≠gOS.i$4)α↓↓↓↓JH4(4PJS#∃π≠WOO≠S↔5?→β↔;6KK?;n+;Q↓εKMβ;␈9βK↔∞#eβ≠␈⊃↓β∪.kC';:q↓απg#↔K;∂#'[↔gI04)α↓↓↓β}s∃β7N;#Qβ?∪'S∃αC?9αM"M$4Ph)↓↓α↓↓#O/≠C↔;"↓∨qj∧"V6A∧"N-j4z>∩&∪YαRM∧rNV
≥JM<4R↓↓↓↓βQ∩ε2bα∩>:*!<4)α↓↓↓βbH4(4R↓↓↓↓π;#'∂Bβ←'3bβ∪=β&C∃β∪.kAβ''≠↔3→ε;⊃βπ∪';Qε β7↔∨≠π∨∃π;#↔9ε#?;∃r↓α?9ααNε&bβ?;∀hQ↓↓↓αβ7'∨G!β←KO#∀4(hP4(4Ph*Cπ>)↓M5;⊂$$%α↓MMk 9]9⊂H$%↓αα7πK≡A↓M1β e]dhP The System
(suspend '|SAVE SYS:FOO.SAV|
'(FOO SHR SYS))
See also the valret function.
1.7.3 Gaining and Keeping Control
In the Multics implementation, when a saved environment is restarted it
looks like an error that returns to top level. The forms in the errlist are
evaluated. These forms should do whatever is necessary to start up the
subsystem. The arguments to the command which invoked the subsystem may be
obtained via (status arg) or (status jcl).
In the PDP-10 implementations, when a saved environment is restarted
execution continues from the point where suspend was called. The next form
evaluated should do whatever is necessary to start up the subsystem. (It is
also possible to cause the same return to top level on startup as in the
Multics implementation by using valret instead of suspend.) The arguments of
the command line which invoked the subsystem may be obtained via (status jcl).
If the subsystem wants to hide the underlying Maclisp from the user, it has
a number of facilities available. By setting up its own user-interrupt
handlers it can handle any LISP errors which occur itself. In Newio
implementations, it can alter, augment, or abolish standard interrupt control
characters. It can replace the Maclisp interpretive interaction loop with its
own by using (sstatus toplevel) and (sstatus breaklevel). It can also provide
a totally different interaction loop by not returning control to the LISP top
level when it is started, but instead retaining control in its own functions
which read and respond to user input.
It is possible for a subsystem to retain the trappings of Maclisp but change
the way things read and print. Macro characters and the readtable can be used
to change the way input is parsed; alternatively, setq'ing the variable read
will redefine the system reader function (in the PDP-10 implementations). All
output by Maclisp (with the exception of character-string messages) is done
through the function prin1, and the subsystem may redefine this function. In
the Multics implementation one simply redefines it, but in the PDP-10
implementations the variable prin1 must be bound to the function which is to
substitute for prin1.
March 3, 1979 ∪3-1.7.2 Page 3-73
Maclisp Reference Manual
Some subsystems don't do any of this, but simply consist of standard Maclisp
augmented by some additional functions which may be used in forms typed in at
top level.
1.7.4 Purity
In the PDP-10 implementations, there are some facilities which allow
subsystems tk put their non-changing data( function definitions, binary code,
etc. into pure pages. This decreaseS the load on memory by sharing pages
betweef multiple users od the same subsystem.
There are some extra storage spaces which are used to store pure
(unchanging) LISP objects. These are the pure list, Pure fixnum, pure flonum
pure bignum, and pure hunk spaceS.
purcopy SUBR 1 arg
This function makes and returfs a copy of its argument in pure storace.
This is primarily of use in the creation oF laBge sharable systems like
MACSYMA. In implementations other than PDP-10 implementations with pure
spaces, purcopy simply petuRns itq abgument,
↓There are a number of fEatures which control how binari code afD
λ consta`≥iLACeJ↓aceS→SCHAβ;#↔9∧ β∂?oβ'3↔ ∧ππ⊗|}&∞j
⊂d
≠x9\λ~3NMh∪∩*: C"APA"P⊃≤5y3DBP⊂⊂⊂∃ i$`P&"FEβE The valqe Od bporg Shoul@⊂@ACY]Csf@↓EJABα↓β≠'FsW51¬;#?O*↓β[πg+∃↓βM→βS#(h!↓↓α↓βπ∪'∪↔OMε{⊂∩α∞Mε*εm≡'∨"∧
Vw∂<XBπ>},Bαε|dε⊗Nl≡'Jα∞
&}∨,≥Rπ∨≤6*r∧∧¬&F≡4π6∞L\PhR∧∧ααε|]f/⊗≥IGJπ=
w.fDM}λ_Y$;⊃→.9λ_O∀≥~→$∞<y<ED_]0~λ7w6,H2|0vZw2r↔λ⊂⊂18≠y3P$\FE⊂⊂λ⊂⊂:x→0z2rλ;t2g→{2y⊂_4w0y≡P1wr→P4yP≠5pr2Y⊂1<P≠0x⊂7\α fasload.
¬
bpeNd VARIABLE
This variable should also always havE a fixnum as its vaduE; this
indicates the last avaidable word of binary prograe space, This is
updated by many internal LISP routines, such as the garbage collector, the
array allocator, and lap and fasload.
Page 3-74 ∪3-1.7.3 March 3, 1979
The System
pagebporg SUBR no args
Causes the variable bporg to be adjusted upwards so as to lie on a page
boundary. This is principally useful on ITS in conjunction with the
function purify. pagebporg returns the new value of bporg.
getsp LSUBR 1 to 2 args
(getsp n flag) ensures that (- bpend bporg) is at least n, allocating
more memory if necessary. If flag is non-nil, then the memory added is
marked as being potentially purifiable by purify. If flag is omitted, the
value of pure is used. This is generally used by clever subsystems
loaders to expand binary program space quickly so that fasload will not
require several garbage collections to do the same thing. It can also be
used by programs which create and destroy many arrays. See also noret.
noret VARIABLE
Normally the garbage collector will return memory to the time-sharing
system if (- bpend bporg) is very large, but setting noret non-nil
prevents this. This is useful in conjunction with getsp.
purify SUBR 3 args
The first two arguments to purify should be fixnums, delimiting a range
of memory within the LISP system. The third argument is a flag. If it is
nil, then the pages covered by the specified range of memory are made
impure, i.e. writable. If it is t, then the pages are made pure, i.e.
read-only and sharable. If it is bporg, then the pages are made pure, but
in addition some work is done to make sure that no UUO on those pages may
ever be "clobbered". (See pure and purclobrl) This option should always
be used if the pages involved contain binary code loaded by lap or
fasload. Presently purifying in the TOPS-10 implementation; it
is intended primarily for producing systems built on LISP, such as
MACSYMA, in such a way that pure pages can be shared between users.
Example: the following function might be used to produce a sharable system
on ITS:
March 3, 1979 ∪3-1.7.4 Page 3-75
Maclisp Reference Manual
(defun superdump ()
(setq lopage (pagebpore)) ;save lkw page address
(setq pure 3) ;specifies pure code
(setq lopage (+ lopage 6000)) ;allow for area 1
; (ITS page = 2000 words)
(fasload funny fasl) ;load up system
(fasload weird fasl)
(uread some lap)
...
(sstatus toplevel ;set up top level for system
'(top-handler))
(setq hipage (pagebporg)) ;save high page address
(purify lopage (1- hipage) 'bporg) ;purify pages
(suspend '|:pdump sys:ts super↑M|) ;tell ddt to dump
(terpri) ;stuff for system startup
(princ 'welcome/ to/ supersystem/!)
(terpri))
pure VARIABLE
This variable, initially nil, should be made non-nil by the user before
loading binary code which is to be made pure. It signals lap and dasload
to be circumspect about any UUO's in the code, because pure UUO's cannot
be clobbered to be PUSHJ's or JRST's. lap solves this problem by
clobbering the UUO immediately if the referencEd function is albeady
defined and is itsElf a subr rather than an expr; oTherwisa the UUO is
made permanently unclobberable (i.e. CALL is converted to CALDF, etc.).
fasload is somewhat more cleveR8 iT too triepεAi↑AGY← EKd@↓KCGP↓++≡~(@@@@↓S[[Kα#'πS.ce1β↔+Q↓βN1β'Q∧∧6∞r}DαεOD
π/'4∞FF*∧⊗&',Z7~ε|dπ&FT∧¬-,t
vrα∀εfO>APRα∧∧αε≡≥MF."∞∞W⊗≡M|'⊗bD∞vFN=∧εO~=ε.≡<\Bε∂D∞FF*Yf"ε|dε.∞=∧ε≡∞MDπ&Zl↔≡f|≤Bbε≥l@hR∧∧ααε\≤6Bα
ZTxN⎇dπ&FQ≥FO∨D∧εO~=F}⊗,↑&."∧↔ OM↔"πM≥V*b∧
⊗0OMRε∂∞∞&␈π-≤↔&(Q$ααα∧g.v>M⊗}r
⊗"ε,\VrεM|⊗&.D'Jα∞Mε∂"<⊗fb∞Mrε6≡=F}∞Edα∧Nd∞FF*∧g.v>M⊗}r
lW6/!Q"αα∧∧ε&}↑4ε>/DF.6≥lV"b∞Mε.r∞∞W⊗No∀απ>≥MBε∞N=rε≡\6Zπ∞↑&≡f|.&bε≥lBαε=⎇g6/.Dε.∞=↓PRα∧∧α¬-Ytπ&z
≡G~π↑&n∞l]g&g∀∞Vv≡M|&⊗/,≤&f*mw⊗jaQ hP→≤bππ↑,RεF≡4ε
εm∨εw.T↔~α
≡G~πl≥G.*D∞FF.df∂≡M|⊗"α.W"εm}BαεL≡αJε,]ε∂6↑1PRα∧∧απ≡⎇\W>F≡Dε&NllW⊗.nMGJr∧∧ππ/,Tπ≡F}]F"ε,Tαπ&Tε&/=≡&."∞=↔V*∧
⊗rπ⎇}&'~∧
v2πMPhR∧∧ααα.↑V}f≥m7~ε≡,V
∪4∧π&F≡4εO~∞-w.vL\Bπ/∧∞Fzε∀∞vF}LTεw.\,W∩ε|dπε∞|↑2rα¬ ⊗2π∞↑&(h$∧ααα
≡2ε⊗↑Nv..dε∩ε∞lDαβBD
↔"ε≡4π&FT
g.n,↑"αε|dπε∞|↑2π⊗≡Mε/∩∞Mε∞r∞Mε*α
nVn⊗↑$ε}0Q!PPh*⊗>*ε5S;0⊃⊃∩ααα62k
fuc H⊃∀αα∧\≡&≡Bε5Bβ⊗w⊂hP`H⊃⊃∩α¬MR¬∨≡>F.hQ!PPh$∧ααα∞⎇w⊗'5e∩α∧L↑Bπ&Tεw.\,W∩ε|dπε∞|↑2ε⊗T
brαλm↔π∨Df∂≡M|⊗"ε<≥Fg~∞⊗>..
w⊗:D⊗v Q$ααα∧∞FF.d∞&/≡↑.f/~ε-bπε≤|W~ε|dε⊗Nl≡'Jπ∞-v?⊗≥Tπ∨ε≤<Rbπ]mF/∨4∩ππ,↑fN␈↑1⊗≡∞MDπ&xQ$ααα∧f∂≡M|⊗"α
↔~ε≥N&.∞O∀απ⊗↑<W↔6\Dπ&F]TααF∃lRrπMWJα≡&*π,↑6/↔l\Bαε⎇mGJε⎇l6*JaQ"αα∧∧¬&G↑4ε6∂=Mv∞"
↔~πN⎇rπ≡↑N2ε}d
bπε≤|W~πMtπ>␈-4π>OMπ2π>T∞6F∞MDε≡∞MDπ&FTfO↔>APRα∧∧απ≡↑Dα⊗∂,\∩β
$∧ε∞vD∞FF*∞<V≡}lDαπ≡↑Dα⊗∂,\∩β∩%dαα∧m}rπ>]f/6↑$ε6∂=Mv∞"∧
ε∂~∞MphR∧∧ααεM|⊗"ε∀6f},,W⊗∞-LR¬-YuBεODF}/4
f␈"∞
F∞≡T
↔"ε≥dπ&FT6}&T&.Nltεf}≤LV"b.W h$∧ααα∞,↔&F↑$εF∂=W~ε≡Dε∞vD∧πεf≤<W~ε≡DεNr≡&.
ε⊃⊗N2
≡Bπ>≡4εv␈D∞FF/,Tαε∞N,V∞'↔4ελh$∧ααα=wπJ
≡2απ
L⊗≡.D
⊗rα∞Mε*π<≥V*α∞,Vf∂M≡f*π
}6O&≥⎇bαε≥dε∂⊗\∀αβ∩d∧¬&F]dαε∞d∧≥ Q$ααα∧
⊗w∨N.V∨&≥⎇bπε⎇≥g&Nltπ&z∞Mε*α
ZTzε≥dε∂⊗\∀β
α
≡2πεL≤6."
≥bπ&Tαε⊗≥l↔↔J=v&*aQ"αα∧∧¬>F]dε∞fD
F}∞M≥f:α
↔~ε,\VrεM⎇f*b∧↔⊗.∀ε"εn∨∀ε⊗*∧∞π/⊗≤m⊗."D'/"≡&.
∧ε∩εn∨⊃PRα∧∧αεv}E`hPQ!∀v␈t∞vF.d∞'.vm≥f:α∞Mε*ε=|F*b∞Mε*α
ZTz?4∞ε}NnLV"πMtαε↔∀∞FF*λ5"?4∧εn∂∀&(h$∧ααα=F}⊗,↑&."¬∞FF*
λEαk⊗∧∧dM:∧¬-,t
ε∞vMLW∩ε≡4ε≡f↑lW∩ε≤-w/"λ5"JD∧ππ⊗}m⊗&.EDε}0Q$ααα∧6␈/.<RbπM↔"πMRπ6≥NV*ε|dεv␈↑]rαε≡4εvNEDε∞vD∞FF*=v&*∞⎇⊗fb∞.Vrαl↔∨&↑$π&FQQ"αα∧∧π≡.=⎇f"πM≥V*ε≡-w.vD&.≡≡↑6*πMRα¬λ:B?~∞⎇⊗fb∞
vNwD∞Fz¬
Z4DR}5bαα
w>/l↑"bε≤aPRα∧∧ααG>>F∂'↑4π/.⎇M⊗v←5∀αεO46∞fL\Bbα∞Mε.r≡&.
ε$αεO46␈ε≤\Bαε,≤6Zε≥nFxN≡,V
β∃APRα∧∧αε.llV∨&≡lVgJ∞]f≡f|,&/⊗≥lrε∞MDπ&FT
U,z}5bα¬M
↔~ε≥MF␈?4∞FF*∧6∞fL\Bε7]l7&N⎇n0hR∧∧ααπMtε⊗*∞N&∞≡\Dε∞>≥≥bbεm}"ε/≥WεfUDε␈∩∞,V&.m≥f."≡2ε/∞∞"ε≡|LRrα l↔'/,≥FgJD⊗ph$∧ααα≡&.
L↔⊗>T∧ε.v}\vBπMtε≡}nL⊗Nr∧⊗fb∞Mε*¬ZYr?~∧∞6F␈]LBε⊗T∧π⊗/<↑'6.G4αG∨L≡G/_Q$ααα∧∞W.}M≥f←~∀¬π
wee∩πN≤]F'~
≥f6␈-\↔&N⎇dπ⊗.L↑f∞wD∞FzπM
↔~r∧λ↔~ε∀∞'.fT
v2πM∞Vn∩AQ"αα∧∧π&FT↔⊗.∀
π≡␈]LBε⊗Tε#α*
L↔⊗>↑$απ&≥bπ&Tεw.\,W∩ε|dε7.l>FN}n4ε≡∞MLV"α/∩π&QPRα∧∧αεf|≤F."∧6}&T¬εNv=NV&Nltα∧d~:αε7]l7&N⎇n2απ>\6Bε≡4αε/≡\⊗bJa_f␈∩∧∞FF*λHT~k⊗↓PRα∧∧απ6↑.6N}eDππ/,Tεn∂∀&*α∞<W"πMtε
εl\v∂&≡lRαπl≥G.*d∧π&FT
V∞>m≡G.&T
↔_O↑<V"ε≡1PRα∧∧αε∞-}f*b∞⎇εNfT∞FF*∞=⊗>r=vw'-⎇G~π⎇
⊗≡B∞<V>n]nBπ&t
F}∞D
⊗w&t¬πε␈=≡FO6T∧βjεM}phR∧∧ααπ<\vn.nN2bεl\v∂&≡lRβj
⊗>B∞<V>n]nBJr∧λ∩εv\|↔&OlTπ6∞N\Rε∞N=rε≡≡↑6/~∞↑V}f≥m7_h$∧ααα≡&.
ε∀απ&tvzε≥dαπ&Tεf␈t∞6.>\]g"b∧⊗v"≡&.
ε$αεNd∞FF*
⊗>B∧∞6.>\]g"r∧λf␈⊂Q$ααα∧6}o≡FN⊗≥M↔'JD∩εv\|↔&OlTπ6∞N\Rεn\≥g~πMRπ≡≥\Rε∂4∩πε}=↔&OlTπ6∞N\RαπMtπ&FQQ"αα∧∧∧M%4
⊗oεL]V.wL≡FN}eaPPh!Q'π/,=F}↔-A∩αα∧
d
∀__$d(Q!PPM↑<V"ε/∀ε6∂=Mv∞"∧∞Fzε<\WαπN,⊗≡Z
|bα¬ZYr?~∞⎇εN≡∧↔⊗*∞
w&.nM⊗∞fO⊃⊗↔/D
f␈ Q$ααα∧
⊗nn\M⊗∂&]K∩ε≡M|&⊗/,≤&f*aQ hPQ%'π/,Q⊂Jα∧∧¬4
)_∀∀dQQ hP~MεO~∧∞f∂⊗≤≤&f(≤=vw'-⎇G~ε≡↑F}n≡M⊗~α∞∞W⊗Nm≤6∂&≥⎇bαε|dα¬~\←ππ⊗↑>6N}n4ε∞vAQ"αα∧∧ε∂&⎇]⊗~π?≥V⊗}N5bα∧≤dεO"
≡2π≡↑Dεv}e]fNb¬∞FF*
≥fO&≤≥Bπ6≥NV*ε≡4εvNE∃Bπ&]bπ&QPRα∧∧αε6⎇MF␈>≥lrε∂,TαπεL≤6."
≥bαπ∞↑&*π>Mw⊗∞|Tπ∨ε≤<W~α
≥g∨&\≤Bε}a≡&.?]L↔∩π>Mw⊗∞|QPPh!Q$n∂,=αβ~Dε∪K;⊃⊃⊂Jα∧α3~k∃frs ⊃⊃∩αα∧∧αα¬≤v*β5Vs8h Maclisp Reference Manual
spaces: pnames of atomic symbols; list, fixnum, flonum, bignum, and hunk
constants used by code loaded with fasload; properties whose indicators
are in the list which is the value of the variable putprop (initially
subr, fsubr, and lsubr). In the SAIL implementation, if *pure is a
fixnum, it should be an estimate of the total number of pure data
structures needed, including all files previously loaded and the initial
LISP system pure data structures (currently about 6000. words). This
causes purcopy to use the high segment for pure data. Making the estimate
in *pure too large merely wastes space in the high segment; making it too
small causes purcopy to make copies in the low segment when it runs out of
room in the high segment. This whole feature only works if pure is a
negative fixnum.
putprop VARIABLE
If the value of *pure is non-nil and the third argument to the putprop
function is in the list of indicators which is the value of the variable
putprop, then the second argument is passed through purcopy to purify the
structure. Furthermore, the two cells of the property list are cons'ed
from pure list space. Since impure cells must precede pure cells in the
property list, putprop may not put a new property at the front of the
property list in this case.
The putprop and remprop functions know about purified property lists.
If necessary, they will copy the property list (but not the properties
themselves) into non-pure storage so that it can be modified. This is
true regardless of the value of *pure. Recall also that defprop and defun
use putprop.
Page 3-78 ∪3-1.7.4 March 3, 1979
The System
1.8 Miscellaneous Functions
1.8.1 The Status Functions
status FSUBR
The status special form is used to get the value of various system
parameters. Its first argument, not evaluated, is an atomic symbol
indicating which of its many functions status should perform. The use of
additional arguments depends on what the first argument is. These
arguments may or may not be evaluated, depending on the first argument.
If certain additional arguments are omitted, a default value is supplied,
again depending on what the first argument is. The various status
functions are listed below.
sstatus FSUBR
The sstatus special form is used to set the value of various system
parameters. Its arguments are similar to those of status.
These are the things that you can do with status and sstatus:
STATUS FUNCTIONS FOR I/O
tabsize (statuS tabsize) returns the number of character positions assumed
between tab stops, which depends on the implementation. Currently
this is 8 in the PDP-10 implementation and 10. in the Multics
implementation.
newline (status newline) returns a fixnum which is the ascii code for the
character which marks the end of a line of input. For example, one
might say (= (setq ch (tyi)) (status newline)) . Cureently this is 15
(octal) in the PDP-10 implementation and 12 (octal) in the Multics
implementation.
charmode (status charmode f) returns the value of the character-mode switch
for the file f. If f is t or omitted the value of tyo (the default
output terminal) is assumed. If the character-mode switch is t (the
normal case for the terminal) output is sent to the device as soon as
March 3, 1979 ∪3-1.8 Page 3-79
Maclisp Reference Manual
it is generated. If the switch is nil (the normal case for files
other than the terminal) output is held until a newline is typed, an
error occurs, input is requested, or the buffer becomes full. (In
the Multics implementation, you can also cause the buffer to be sent
by using the force-output function.) This provides increased
efficiency at the cost of not immediately seeing all output in some
cases.
(sstatus charmode x f) sets the character-mode switch of the file f
(f may be t or omitted to signify the output terminal in the tyo
variable) to x, which may be nil or t. x and f are evaluated.
Currently in the PDP-10 implementation it is not possible to set the
character-mode switch; one must specify it Initiallq To open. See
also (statuS linmode) and (status fiLemode)*
λlinmode (statuc linmoDe) rea` fAQQJ@@ YS]J↓[←IJλAC]HQggi¬ikFA1S][←⊃J∪pR↓gCiF4∀∩@AQQJ@E1S]J@↓[←IJλAi↑A`@@Qh↓←dA]%X\R@↓)QKg∀AMk]
iS←]LAiCW∀@AC\↓←aiS=]CX~(∩@AKaieBA¬eOk[∃]hXA]QSGP↓SfAi!JAMS1JAoQ=gBAY%]JA[=IJASLAEKS9NAISMGkgg∃H\~∀$@A)Q%fAIK→CkYiLAi↑AQQJAm¬YkJ@↓←LAieR@Qi!JAIK→CkYh↓S]akP@AiKI[SMC0RT@A%\~∀∩AC]r↓GCgJ0AiQSLAMSY∀A[kgPAEJA∧AiKe5S]CX8@A∪\↓c←[JAS[a1K[K]QCiS←9fAiQ∀~∀∩@EAS]∀A[OI∀DA[CdA]←h↓EJAG!C]OK⊂\@A∪_AiQJEYS]∀A[OI∀DASf↓hX@AUgKdA%]akh4∀∩@A%bAEk→MKeK⊂@Ak`↓B@AY%]JACP@ABAQS[J@↓EKM←IJAEK%]N@AMK]hAQ↑@A→%' \@↓)QJ~(∩@AS9akh[∃ISiS9NAG←9mK]i%←]fA=HAiQ∀AQ←gPA←aKICiS]≤AgsgQKZACIJ@AkMKH\@↓∪D
∀$@AiQ∀@EYS9JA[←⊃JDA∪β→β;'baα2&≥'O↔/→β↔π≡Aβ∂#∂∪π∂S/⊃βπMεKQβ'~↓βSG∧+⊃βπv 4(¬αβπCCdK↔MβM#E↓β⎇;9β'wβWQ↓ε+∪'SNs≥β∂|s[↔;&K?;MpIαS#O→β7?&)↓β∂∞qβCK␈3'∪∀hP%↓βHsCWQ∧3π∂'fKC'↔~β7?K*βOW'&+⊃βSzα2&Nαβπ;⊃¬β?OOL∧&gJ,W'→<H∧
_;Y
M;Y`
|C"B∧∧≥~→$∞→<[-≥X;∧
9Hλ
≡λ~<d(λ≥∂≡→(≥
=∪ ~tλλ
=Y⎇|d(→|L\=λλL8;λ≤[⎇=¬A B(∧ ≠⎇y.l<Kλ
≡λ≥<l↑h≠;n,(≠8,=~;Y$∧≤Y<m}<Xq.5Hλ∩.D~<h∞
||z,-→(→M}Hλ_$∞<y<AQ@∧P⊂≤97sy_vP:7H:0urH24y2Xz⊂1g[:97fλ⊂7s⊂≥42P:→y2tw_v⊂;t→w⊂:4→P⊂⊃6~w2P6[r2QεB∧P⊂$\P74f∞P⊂47]r{2i⊂:44\P⊂6p↑P92x]ty2P~w7{v→r3rPλ7s⊂*~2P⊂∀≤yz0z≥yP::≡TWεEαP⊂*4→P&zv≥4qyP~vx6 %maftation always operates with a "line mode" of t.
SeE alco the (sstatuc ttysc@¬\RA
U]GiS=\AEK1←n\~(~∃iieS]h∩@QggQCikf↓iasS9hAGQ¬dAMk9F@AM%YJRAQke]f↓←\AB↓iir@↓S]iKIekah↓GQCE¬GiKd8~∀α@↓/QK\↓iQJ@↓GQCe¬GiKd↓GQCdASfAQsaKH↓←\@AQQJAS9akh@↓iirA→SYJXAiQJ↓→∪' 4∀∩@AAe←Oe¬ZAoS1XAEJ↓S]iKIekai∃HAC]⊂AiQJ↓Mk]GQS←\A→k]FA]SYXA J@ACAaYSK⊂Ai↑~(∩@Ai]↑ACe≥k[K]Qf@ZA→SYJA¬]HAG!Cd\@↓∪LAM%YJASLA←[Sthe value of tyi
(the default input file) is assumed. The char may be either a
character object or a fixnum (ascii code). Any of the 128. ascii
characters may be used. The func may be either an ordinary
functional form or a fixnum, which means the default system action
for the character with that ascii value. For instance a func of 7
Page 3-80 ∪3-1.8.1 March 3, 1979
The System
means quit back to the top level of LISP (control-G). If func is
nil, the char is made non-interrupting. All three arguments are
evaluated.
In the ITS implementation, it may be necessary to use (sstatus tty)
to inform ITS about non-standard interrupt characters.
In PDP-10 implementations which support fixnum tty input mode (more
than 128. characters), then when an interrupt occurs the character is
folded down to 7 bits before selecting an interrupt function.
However, the unfolded character is passed as the second argument to
the interrupt function, so that the function can filter out unwanted
characters. If a fixnum is used for the function, then the fixnum
may specify required or forbidden supra-ascii bits as follows:
adding bit n to the fixnum requires the bit, and adding (lsh n 18.)
forbids it. For example, in the ITS implementation using 400000207
(octal) as a function allows CTRL/g to perform a quit, but not the
"pi" character or control-meta-g, since 200 requires the control bit
and 400000000 forbids the meta bit.
Example: a standard subsystem convention (used by NCOMPLR, MACSYMA,
and SCHEME, for example) is to use ↑↑ (control-uparrow, ascii
036) as a quit character which restarts the subsystem. This
leaves ↑g with its normal meaning of "exit to LISP toplevel,"
which is occasionally also useful.
(sstatus ttyint 36
(function (lambda
(f c)
(sstatus toplevel '(restart-subsystem))
(do nil ((or (= (listen f) 0)
(= (tyi f) 36))))
(↑g))))
(defun restart-subsystem ()
(setq errlist nil)
(sstatus toplevel nil)
(nointerrupt nil)
(initialize-the-world)
(enter-subsystem))
(status ttyint char file) returns func, the interrupt function for
the character char on the tty file. file may be omitted. It
defaults to t.
March 3, 1979 ∪3-1.8.1 Page 3-81
Maclisp Reference Manual
ttycons (sstatus ttycons tty1 tty2) binds two tty files into a console. One
should be an input tty and the other an output tty. If tty1 or tty2
is t, it will be taken as the appropriate direction of the default
terminal (determined by the variables tyi and tyo). The binding into
a console is primarily used for purposes od ecHoing. In addition,
interrupt chabacters typed on an input tt`∩∪→SYJAMQ←kY⊂@ACM→KGhAQQJ~∀$@A←kQakhA=\ASiLAG←eIKga←9IS]Nαβ?WSπ+Q↓β'#eβ≠Nc∃1βv{Qβ?rβG?7*↓β?SF+IβS'I84(J↓α'→π#SeEε{IβS'IIβπg∪↔π∪Jβ#πMε βSSN≠?;Mπ∪↔3π&K?;OFKA1β&CπQβ⊗+3πSN{;O#O4(%αβ'Mβ↔∪?/↔rβ↔≠␈∪∃βSF)β;↔:β?;∃εKMβ↔∨#π3O≠#↔⊃ph(4(J↓α'→ε{;∃β∂∪∨W7.sQβ'~β¬βS'Iβπ;"βS#∃ε{S#↔∩β'MβvK11β
βSSg≡{;Mβ⊗+3πSN{;O#O4(%αβ';[}c[';:βS#π"βSSeπ;'31ε∪∃β⊗{/↔9r↓α∂3␈≠';≥ε βSSJ↓β≠'f)βπW&{7πSN≠π33Hh(%↓ε∪K↔π←→βπ;JβSSg≡{;Mβ⊗+3πSN{;O#O↓β'Q∧kπeβF[∃8JBO↔∃ε≠3?O*q$4(hP%↓α&yβCW"β↔∂#}K;≥β∂!βS#*β?S&{5β?2βS#∃π≠∂K↔.q1β∪O≠S';∨!β≠K}iβ?W'βWQ0hP4(%α↓↓↓↓G≠OSπ'+MβS'K∂?;~βP4(HH%↓↓α↓↓↓#≡+SEβ.≠#?S'I↓#?ε+9↓∨'#ei↓:C↔∂#zβ?WQπ#Se%Hh($$HI↓↓↓ε+∂#?'#e%$hP4(%αβ←#'≡Aβ∂?w≠↔Mβ'#eβ'wβWQβ>KS!β
β;↔]π#Seβ␈+SCW"β∂#πvs↔1β>C'∂!εKM↓β≡+QβSxh(%↓ε;=βSzβS#∃ε+∂#=εK↔¬εQβSF)β?'#?5β}1βS#*βO∂K.+984Ph(%↓αCOSπ'+MβS'K∂?;~βSSe
IβK↔'+K;Mπ##∃β␈##↔Iπ#Seβ6K3∃β>C'∂!εKM↓β⊗{W;⊃εK;S<hP%↓β
β∂?;≡{3∃β>KS!β'#eE1ε{Iβ;Naβ'→π##↔K*β'Mβv{;∃8hP4+≠Nc↔7?&)↓↓#∨#πSW~β≠'3.k?∪∃ε3'3∃J↓↓uyαC?C↔rk7?∪*k3'O"↓8''w#↔K;∞a7∂K.3Q%9αβ?C↔rh4(%αβ7?∪*k3'O"↓β'Mαβ¬↓β∨+'Sπ⊗c∃βO.≠?;⊃αβπK∨.k↔;Qαβ≠?IαβS#∃αβ?C↔rβ≠W;∨#'?9ph(%↓εK;S↔⊗sπ17∨∪W≠Qαβ'M↓ε ↓β3O≠Q↓β}1↓β'oβ3↔7.sSπSN{97∪/β↔;∪.sQβ'v3?K7∂#'?8hP%↓β>C'∂!εkπeβ≡{7↔SNk↔Mβ⊗)β;↔.#↔⊃β↔IβOC.≠'π1πβK?∨⊗7M8hP4(%ααS#∃ε3?33␈;';≥π≠g7}cMβ7∂I↓βππβ↔πIεK9β'w#↔K;∞a7∂K.3Q8%E##↔O(KπK∃π##∀4PI↓βO&;∪π⊗#'k↔"β?;↔≠Yβπ∪&KS'?v1βONk?3~β7πeεCC↔∂⊃βπQπ##∃β&KO∂K/#'?9ε{_4(J↓βS#*β'7Cf+7↔;&S'?rq$4(hP%↓β∨+KO?↔β?L%¬##'Mε3'3∃αCπ9β␈+SCW"βSSeJβ#πMπ##∃β∞∪'3''I↓βSzβC?OO#'?8hP$$%εKSMβ∨+KO?∩βπ;g>C↔K∃ε{9βSF)βO∂⊗+↔99¬≠↔∃β∨+KO?↔β?M8hP4(%αβ≠'3/β?L%¬##∃β6K3↔C␈→↓β≠.s∂S'}qβ∂πrβ∃↓π+O↔⊃π#<'π≡≠↔OMπ∪π;∪}k3d4PH$%β>KS#'rβS#∃ε3'3∃r↓αO↔*βS#∃ε3'3↔ε{Mβ≠.s∂S'}q84(hP%↓β↔+?W IαS#O→↓β≠Nc∃↓↓F9↓↓ε{WSC/!↓βS'I%↓βFM↓↓π≠↔3↔∨#'[∃αβ↔Kπ≡(4(4Ph*Cπ>)↓M5C⊂$$%α↓MMk 9a9λH$%↓αα7πK≡A↓M1β e]dhP0$$HI↓αSF)αOg∨#↔44Ph(4(HH%β∂∂βπ'fKSe9α↓#∂W↔≠?KC␈→↓↓∨BIβ←'fa↓β←␈∪-9α≡+∃↓β∞cO=β&C∀4(HH%βK.∪?WQε3W;∂&K?91πβπ∨∃αp4(4PI↓βO∞K0$%¬##'Mαβ≠'3*↓↓#πr↓β?W'βWQβ'#e%↓εCπM↓π##∃↓π≠=7∂∞c3↔⊃¬~ε&0hP$$%ε≠#πK∞≠S↔Iπ≠↔Q9ααS#'~β'Mβ∞qβ↔c&+;O'}qβ?→εO∂'Jβ←#'≡Aβ'LhP$$%π∪↔3π&+⊃βSzβWQεs?Qβv+∂↔O≡K'3Jβ'∪↔w#'∂πbβS-β&C∃βπ∨#Wπ0hP$$%ε≠#πK∞≠S↔I¬≠↔Qβ/≠↔⊃β∂!αNεLa84(hP%↓αN1β≠'f)β'Mε β∂3␈≠↔⊃β6K3∃β}∪+↔∂"a↓#O&SWMε3'3↔n{∪∃%εk↔K↔gIβK↔'+K;Mεs'04PI↓β'w≠S↔π"β?→β>K[';:βπ9β/∪K?Iph(4+'#gO∂∞q↓↓↓G≠OSπ'+M↓β'#gO∂∞qβ≠Wv→↓β≠Nc∃%β∞c3?←_KS#∃π+O↔IαβS=βpply a function
which performs initial processing of terminal input. func is a
functional form, and file must be a tty input file. If it is
omitted, the value of tyi (the default input terminal) is assumed.
Both arguments are evaluated.
When LISP wants to take input from file, it first calls the prescan
function, which is supposed to gobble down a complete unit of input
(for instance an S-expression) and return a list of characters. The
prescanner supplied automatically by LISP when a tty input file is
first opened counts parentheses and does fancy rubout processing on
display terminals. It also implements the CTRL/k, CTRL/l, and CTRL/u
characters (as appropriate to the implementation) which allow the
complete input to be redisplayed or cancelled, and takes care of
force-feed characters. A user-written prescanner might provide
additional features such as super-parentheses, name recognition and
completion, or fancy editing.
The prescan function func is applied to three arguments: the file,
the name of the input function on whose behalf it is acting (read,
readch, or readline), and a fixnum which, in the case of read, is the
count of the number of unmatched left-parentheseS. It is supposed to
return a list of fixnums, which represent characters. The prescan
function should pead the input with tya, since it And tyipeek are the
only iNput functions which don't call the prescan.
If the prescan function returns nil, an eof condition occurs for the
input File. This is the standard way to Signal over-rubout.
There is a fUnction called rubout to assist the pre-scanner in
proceSsifgrqbouts. It is described on page .
¬
March 3, 1979 ∪3-1.8.1 Page 3-83
Maclisp Reference Manual
α
It is a good idea for the prescan funcTion to lambda-bind echofiles
to nil so that characters do not appear in the echo files twice, and
sO that the echo files reflect the "clean" input after rubout
processing. The system-supplied prescan fUnction does this.
(status ttyscan file) returns the fIle's func.
¬
This feature does not presentlq exist in the Multics implEmentation.
The fOllowing status functions exist only in the ITS implementation
ttysize (status ttysize f) returns the height and width of the terminal open
as the file f. If f is omitted, the value of tyo (the default output
terminal) is used. The result is a dotted pair of fixnums
"(ttyheight . ttywidth)" (cf. cursorpos). If the terminal is a
printing console instead of a display, then the height will be a very
large number such as 200000000000 or so.
ttytype (status ttytype f) returns the type of the terminal open as the file
f. If f is omitted, the value of tyo (the default output terminal)
is used. The result is a fixnum taken from the TCTYP (not TTYTYP!)
variable in ITS:
0 Printing terminal.
1 Good Datapoint.
2 Bad Datapoint ("loser").
3 Imlac.
4 Tektronix.
5 PDP-11 ("Knight") TV.
6 Memorex.
7 Software terminal.
10 Terminet.
11 Display using standard ascii display codes.
12 Datamedia.
This status call is meant only for esoteric purposes. To find out
whether you can position the cursor or erase characters, use (status
filemode).
tty (status tty f) returns a list of three fixnums which control the
behavior of the terminal open as file f. If f is omitted, the value
of tyi (the default input terminal) is used. (sstatus tty x y z f)
Page 3-84 ∪3-1.8.1 March 3, 1979
The System
sets these three fixnums to x, y, and z. If z is omitted, it is not
changed. If f is omitted, the value of tyi (the default input
terminal) is used. The three fixnums are the ITS variables TTYST1,
TTYST2, and TTYSTS. Their meaning is as follows:
TTYST1 and TTYST2 are divided into twelve groups of six bits. Each
group controls a certain subset of the ascii characters. These
groups, in left-to-right order within TTYST1 and TTYST2, are:
(0) ↑@-↑F ↑K ↑L ↑N-↑R ↑T-↑Z ↑\-↑←
(1) A-Z a-z (letters)
(2) 0-9 (digits)
(3) ! " # $ % & ' , . : ; ? @ \ ` | }
(4) + * - / = ↑ ← (arithmetic operators)
(5) < > ( ) [ ] (parentheses)
(6) ↑G ↑S
(7) ↑I ↑J (tab, linefeed)
(8) altmode (ascii 33)
(9) ↑M (carriage return)
(10) rubout (ascii 177)
(11) space, ↑H (backspace)
The meanings of the six bits in each group are:
40 Echo the character when read by LISP (normal mode).
20 Echo the character when typed (this may disappear from ITS
soon!).
10 Echo in "image mode" rather than "ascii mode"
4 Convert lower case to upper case (applicable only to letters;
not normally used by LISP - the readtable accomplishes case
conversion).
2 Activation characters. If this bit is not set, then ITS will
not schedule LISP to run when you type a character within the
group even if LISP was waiting for terminal input. The only
purpose of this is to increase the efficiency of the time-
sharing system. For example, letters and digits normally have
this bit off, since typing one cannot terminate an S-expression,
and there is no point in "activating" LISP until an S-expression
terminator like space or ")" has been typed. An exception to
this rule is that for tyi and readch LISP asks ITS to activate
on any character. Normally only groups (0), (5), (6), (7), (9),
(10), and (11) are activators. If you alter the readtable, you
may wish to change the activator groups.
March 3, 1979 ∪3-1.8.1 Page 3-85
Maclisp Reference Manual
1 Interrupt characters. If this bit is not set, then even if you
have used (sstatus ttyint) to set up an interrupt function you
will not get the interrupt since ITS won't tell LISP about it.
Initially only groups (0) and (6) cause interrupts (these
include all control-characters except altmode and format
effectors). If you give @ an interrupt function, for example,
you should set this bit for group (3).
On a keyboard with supra-ascii characters, one may wish to use meta-
characters for interrupts. Suppose we want meta-D to run the
function foo. Then we would turn on the interrupt bit for group 1
(letters) and say:
(sstatus ttyint 104 ;letter D
(function (lambda (f c)
(and (= c 504) ;meta bit
(foo)))) ; is 400
- filter out plain "D"
Notice that this only handles meta-D, not meta-d. To handle the
latter, one must also do (sstatus ttyint 144 ...).
Another way to filter out plain "D" is
(sstatus ttyint 504 ;require meta bit
'(lambda (f c) (foo)))
which is somewhat more efficient. On the other hand, to use both
meta-D and control-meta-D, we must do a dispatch on the control bit:
(sstatus ttyint 4
'(lambda (f c)
(cond ;ignore
((or (= c 304)(= c 344))
(setq ↑d t))
((or (= c 504)(= c 544))
(meta-d-foo))
((or (= c 704)(= c 744))
(control-meta-d-foo)))))
The third variable, TTYSTS, has these bits of interrest:
40000←22 (%TSFCO) If set, output on this terminal uses the supra-
Page 3-86 ∪3-1.8.1 March 3, 1979
The System
ascii convention of an "alpha" prefix for "control" and
"beta" for "meta".
20000←22 (%TSALT) If set, ascii codes 175 and 176 are not
converted to 33 on input.
10000←22 (%TSROL) If set, terminal is in scroll mode.
4000←22 (%TSSAI) If set, echoing and ascii output use the SAIL
character set; otherwise, control characters are output in
the form "↑X".
10←22 (%TSNOE) If set, suppress echoing of typed characters.
2←22 (%TSSII) If set, terminal uses "super-image input" mode.
Not even ↑Z and ↑← can take their usual effect for ITS.
Notice that some of these bits affect output even though the argument
is an input file; they affect the output terminal which is logically
related by ITS to the input terminal. Normally LISP or the user will
arrange for (status ttycons) to reflect this relationship.
STATUS FUNCTIONS FOR THE OLD I/O SYSTEM
uread (status uread) returns a 4-list for the current uread input source,
or nil if uread is not being done.
(sstatus uread --args--) is the same as (uread --args--)
uwrite (status uwrite) returns the 2-list for the current uwrite output
destination.
(sstatus uwrite --args--) is the same as (uwrite --args--)
crunit (status crunit) returns a 2-list of the current unit; i.e. device
and directory.
(sstatus crunit device directory) sets the current default device and
directory for uread, etc. The arguments are not evaluated.
crfile (status crfile) returns a 2-list giving the file names for the
current file in the "uread" I/O system.
(sstatus crfile name1 name2) sets the current default file names for
uread, etc. The arguments are not evaluated.
March 3, 1979 ∪3-1.8.1 Page 3-87
Maclisp Reference Manual
STATUS FUNCTIONS FOR THE READER
See section 13.6.2 for a description of how the parameters controlled by
these functions are used. All of these parameters are kept in the readtables,
and the status functions below deal with the readtable which is the value of
the variable readtable. Note: in the following, c represents an argument
specifying a character, If c is non-atomic it is evaluated, and the valua must
be a fixnum which is the ascii code for a character(∧@A∪_AFASLACi←5SFASP@ASf↓]←h~)KmCYUCiKH0AC]H↓ShA[¬rAEJ↓BAMSa]kZA=dABA
QCeC
iKdA=EUKGP\~∀~)GQie¬\∩@@!giCiUfAGQQeC\ARAOKQfAiQ∀AGQCICGiKHAieC9gYCi%←\Ai¬EYJA∃]ier%M←dAQQJ~∀$@AGQ¬eCGi∃dAF\%)QSf↓SfAi!JACg
SRAG=IJA←_ABAG!CeCGQKdAgUEgiSQkiKH↓M←dA~∀∩@↓oQK\↓Sh@A¬aaKCIf@Q]=hAae∃GKIK⊂@AEr↓gYCg RAS\%BAa]¬[JAE∃S]N@↓eKCH↓S\\~(∩@A)!Sf∪M∃Cike∀@ASf↓kgKHAS\@↓iQJAA Zb@@AS[AYK[K9iCiS=]f@AQ↑Aie¬]gYCQJ~∀∩AY←o∃d[GCMJAS]AkhAi<Akaa∃`AGCMJ\~∀4∀∩@@!ggiCQkf@A
QieC8AF@A,RAgKQf@AF≥fAGQ¬eCGi∃d@AiIC]gY¬iS←\↓i↑@A,\@@A,ASf~(∩@AC1oCsf↓KmCYUCiKH8@A'K∀AiQJ↓gKige]iCp↓Mk]GQS←\\4∀~∃ge]iCp$@@QgQCikf↓gs]i¬pAFR↓eKikI]fAi!J@Age]iCp↓ESif↓M←dAQQJAG!CeCGQKdAF0@ACf↓B~∀∩AMSq9kZ\~(~∀∩@Qggi¬ikfAMs]iC`AFAZ$AgKiLAFOfAgs]QCpAE%ifAi<AZ\@↓ZASfAKmC1kCiK⊂AC]H4∀∩@AIKike9KH\@↓)QJAMKigs9iCpA→k]Gi%←\ASLAkgk¬YYbA∧AEKiQKdAo¬rAi↑↓I↑Ai!SfX~(∩@AQ=oKmKHX~∀~)≥P∨S*βS#π"↓β'9π##∃↓ε?[*βS←=π≠OSπ'+M↓β≡3#Mbβ'→↓ε→β'Mε ↓β7∞≠K=β≡CπKπ∨#↔I↓εKQβ'_h+∂#∞s∨↔⊃ε∪π∂-π#=β''→βOS∞s∪πK"↓βOgw#πaβ∞s⊃β∂G#Kπ9ε∪↔≠?⊗)βS#*↓βK↔∂+↔OS.!β?C-∪πS'}p4+π~βC↔K6{K'↔ q↓α#|εv/6↑%BεNd
⊗rπMRπ∨L≥f&∂,Dπε.≤NF∞⊗LTε~ε≡4ε
ε\≤7⊗Z¬
∩v*d∧rε∞hDβXh,≥f"πE∃BεNn>F.∞D
v2ε,]⊗v:=ε∞v|\BαπMtεO'4∞7&∞lL↔⊗"∞?⊗w&∨∧ε∞vD6G',≥bαε≡N2π∨≥nF∂@Q-↔~π<↑Bπ&tεSβ∩¬∞6f∂=
⊗6N\Dε/GL]f&.D⊗gε≤&/&≤5∩ε∞lDεO'46G',≥bεO4∞6/"∞MrεON<Vf2aQ hV\≤7⊗x∀∧αG∨L≡G/~
\⊗∨⊗) returns nil if c is not a macro character. If c is
a macro character it returns a list of the macro character function
and the type, which is nil for normal macros and splicing for
splicing macros.
(sstatus macro c f) makes c a macro character which calls the
function f with no arguments. f is evaluated. A fourth argument to
sstatus may be supplied. It is not evaluated. If it is an atomic
symbol whose pname begins with s, c is made a splicing macro. If f
is nil, instead of c being made a macro-character, c's macro
Page 3-88 ∪3-1.8.1 March 3, 1979
The System
abilities are taken away and c becomes an ordinary extended-
alphabetic character. The setsyntax function is generally a better
way to do this, however.
+ (status +) gets the value of the + switch (t or nil) in the
readtable. This switch is normally nil. If it is t, atomic symbols
more than one character long beginning with a + or a - are
interpreted as numbers by the reader even if they contain letters.
This allows the use of input bases greater than ten. See ibase.
(sstatus + x) sets the + switch to t or nil depending on x, which is
evaluated. The new value of the + switch is returned.
ttyread (status ttyread) returns the value of the ttyread switch in the
readtable. At present this is not used for anything in the Multics
implementation. In the PDP-10 implementation it controls how tty
"force feed" characters are used.
(sstatus ttyread x) sets the ttyread switch to t or nil depending on
x, which is evaluated. Again, file defaults to t. The new value of
the switch is returned.
STATUS FUNCTIONS FOR THE PRINTER
terpri (status terpri file) returns the value (t or nil) of the terpri
switch for the file, which defaults to t. This switch is normally
nil. If it is t, the output functions such as print and tyo wilh not
output any extra newlines when lines longer than linel are typed out.
See also the terpri variable.
(sstatus terpri x file) sets the terpri switch.
W (status ← ) @IKike9fAiQ∀@AmC1kJ@QPA←d@↓]SXR↓←LAi!J@A>↓goSi
P∪M←HAiQJ4∀∩@A
keeK9h@Ae∃CAiC YJ\@↓∪L@AQQSfAMoSiG ∪SfAPX@Ai!JA>@↓M←e[¬h@AM=dA←GQCX~∀$@AMSa]k[f↓oSiP↓Y←if↓←LAiICSYS9NAuKI←KfA%bA]←PAkgK⊂\~∀~(∩@@QMgiCiUfA>A`AMSY∀RAgKQfAiQ∀A>Ag]SiGP↓i↑Ai!JAmC1kJA←_ApXAPA←dA9SX\~(~∃CE eKmS¬iJQgQCikf↓CEEe∃mSCi∀R@Ae∃ice]LAiQJ↓mCYk∀@A←L↓iQJ@↓CEEe∃mSCi%←\AG=]ie←0\~∀∩A'KJ↓gKGi%←\@bL\nAM=dABA⊃KgGe%aiS←8A←LAQQJAC EeKm%CiS←8AG←]Qe←X\A≥←i∀~∀∩@↓iQCh↓iQJA¬EEeKYSCiS=\AG←9ie←X↓SfAW∃ahAS8AiQJ↓Gkee∃]hAe∃CAiC YJ\~(~∀~∀4∃≠Ce
P@fXbrnr$∩∩@@&fZbαqa9DHH%↓↓α↓↓↓αε∨∃↓~iad4P0$$J↓↓α7∞≠3'OααK↔≠-∪↔;∂*α7π;.0$λhP4λ⊂∧αG∨>L↔'∞4⊗⊗↔,ZfN∂LTεrJ∞<Wπ~∞Mε*ε≤,'⊗/m_↔&N⎇`ε≡}nN&}b∞MrεraQ h⊂⊂∧αG∨>L↔'.4⊗⊗↔,ZfN∂LTεvNE∀π'<[\d
yQH≤X\Y.m8=~-⎇KC"AP@∧@⊂
9yz0]:qP X192k~pz2P≥⊂P::\71P'[⊂6p|~vpv⊂_vwzg≥⊂7s⊂_q192]4pz4[w↔εEαA)b U*iP#∃g!b∧Se)P#∪i⊂*∧⊃P#`i⊂ cbP⊂af&"Ph∧OR
αgctime (status gctima) Returns the number od∧A[S
aP∨O,≠?;∪~↓βOC.sQβ∨∂∪π∨*h4(∀∧ε≡}MHV∨&≥lr`h!Q Jα¬∞7∨&≡NW~ε|>FNnT∧εrJ∞,W≡=≤h∞M→(λ@qz4vYP1w`5nterto n anDAeKiUeUfAQQJ~∀ @Aae∃mS←KLAmCYUJA←L↓iQJA≥GiS[∀AG←k9iKd\4∀∩∧∩A∪hA%`
β¬∧∧v}}D
,L8(∃
t→≠h¬xj(≥Yλ≥
;H
∞≡⎇_=∞↑h→xnM99(ε¬(λ~N≡⎇λ⊂L\[tY!Q@(λN8εx$[3P7z]⊂0P 3ubsyStee. SeE also (status gcwho).
~∃MaG]C5Kf@@!giCIUf@AgAG]C[∃fRAe∃i`↔Kw→↓⬬FO∨D∧ε}2∞Mε*α
l⊗n/4
v N≥MBαπMRπ∨≤6/_Q!ααε≡hλ-≥_8[T~;@∞M→(∪ ~tλ_L];Q`∞↑y1βD∧∃~→.≤(_<LT≥~→$
X;9.4λ_8l<<≥_,-→(≥
q"B(∧∞~→(∧9≠∪l4λ→U-l⎇~;ma8;Y∧∞≠b=
(λ→M⎇≠≠um≥Yb<nL=→4a≤];XnM;{\d∞z~0m↓ B(∧∞Y<=-≡Y(_$∞|_8lT_8Yn]9;]¬A"C"N>_|z/,(λλ¬∞⎇_=∞↑h≤|>z>Y$∞|_8lU(≤Y.Nαy79H⊂:42H0qz:Xv⊂1z\92w:λ9t⎇2H7s⊂⊂≤x0qbK⊂4wεB∧P⊂+[y29Wλ⊂9x0XpP4iH2{0v≥pz2rεEεE→qvp|αP⊂∀9]0z:iH3qvp↑⊂9x0XrTP)→z:y7≤P:42H3qvp↑⊂80y_vrz2\⊂37`2 space.
sstadus gcmax space n) seTpεAiQ∀AOG[¬pAaCIC[Ki∃dAM←HAgaC
JAi↑↓\\~∀4∀∩@AMKBAi!JACY1←FAMU]GiS=\\~∀4∃OG[%\∩@@!giCIUfAOG5S\AgACGJR↓eKikI]fAi!JAOG5S\Aa¬eCKKQKdAM=dAga¬GJ\~(~∀∩@↓ggiCQkfAO
[S\AMaCGJ↓\RAg∃ifAi!JAOG5S\Aa¬eC[KQKdAM=dAga¬GJAi<A\\~(~∀∩@↓'KJAQQJAC1Y←FA→k]Gi%←\\~(~∃OGMSuJ∩@Qgi¬ikfA≥GgSu∀AgaC
JRAe∃ike]L@AiQ∀AOGg%uJAa¬eC[KQKdAM=d@AgACGJ\A)QSL~∀∩@↓SfA]=hAiQ∀ACGiUCXAg%uJA←_AiQJ↓gaCG∀@ZAg∃J@QgQCikf↓gaGg%uJR\4∀~∀∩Aggi¬ikfA≥GgSu∀AgaC
JA\R↓gKif↓iQJA≥GgSu∀AaCe¬[KiKHAM←d↓gaCG∀Ai↑A8\~∀~(∩@A'∃JAiQ∀ACYY=FAMk9GiS←8\~∀~)!COJfZr`$∩∩@@&fZb8p\b∩$∩@@A5CeGPfX@bdnr~∀_∩∩∩$@A)Q∀A'sgQKZ~∀4∀~∃aUegaG9C[Kf@@@QMiCikLAakeMaG]C5KfR@↓eKikI]fAB%YSgh↓←L@A9C[Kf↓←L@AMaCGKLAoQS
P~∀∩@@@@AQCm∀Aake∀AmKeMS←]f8@A'K∀Aake
←ar\4∀~∃aUegSu∀@@@QMiCikLAakeMSuJAMaCGJ$@AeKQke]f↓iQJA¬GikC0@AGkIeK]h↓gSuJ↓←L@AQQJAaUeJ~∀$@AmKIgS←\↓←LAgACGJ\A∨]YdAgaC
KfAe∃ike]∃HAErQgiCQkf@AAkega
]C[KLRAQCYJ~∀∩Aake∀AmKeMS←]f8~∀~∃AIY]C5Kf@@!giCiUf@Aa⊃Y]C[∃fR@AIKike9fAB@↓YSghA←L@↓iQJA9C[KfA←L@↓CYX@↓iQJAAIYf~(∩@ACYCSYC YJAS8AiQJ↓→∪' ↓EKS]≤AkgK⊂\@A)!KgJA¬eJAi!JA]C5Kf@A¬GGKaQCEYJ↓i↑~∀$@AiQ∀AM←Y1←oS]≤AgiCQkfAMU]GiS=]fAo!SGPAIKckSIJABAAIXACIOk[K9h\~∀4∃aIYMSuJ@@Qgi¬ikfAAIYgSiJAaI0RAeKQke]f↓iQJA
keeK9hA]k5EKdA=LAo←IIfA←8ABAa⊃X\~∀4∃aIYI←←Z@@Qgi¬ikfAAIYe←=ZAaI0RAeKQke]f↓iQJ@ aIYe=←ZDA=LABAAIXXA$]J\AQQJA[¬qS[k4~∀∩@↓gSuJ↓i↑Ao!SGPA%hA[CdAKmKHAOe←\\~∀~)aIY[¬p∩@@!giCiUfAaI1[CpAAIXRAIKike9fAiQ∀AGkeIK]hAYCYkJ↓←LAi!JAaI1[CpAACeC[∃iKd~(∩@A←_ABAa⊃X\~∀4∀∩@@!ggiCQkfAa⊃Y[Cp↓aIYg%uJRAMKifAQQJAa⊃Y[Cp↓aCeC5KiKd↓M←dAQQJ@AAIXAgACGJ~(∩@Ai<AgSu∀\@A¬=iPACIOk[K9ifACIJAKm¬YkCi∃H\@AMKJAC1g↑Ai!JACY1←FAMU]GiS=\\~∀4∀@@AQQJAM=YY←o%]NAgQCikf↓Mk]GQS←\A∃qSgiLA←]YdAS\AQQJA!⊃ Zb`↓S[aY∃[K]i¬iS←\4∀~∃[∃[MeK∀@@@QMiCikLA[K[→eKJRf words of address space not yet
allocated for any purpose (i.e. still available for allocation to
various spaces).
ENVIRONMENT ENQUIRIES
Note: the various enquiries related to time may return nil in the rare
circumstance that LISP cannot determine what time it is.
date (status date) returns a 3-list of fixnums indicating the current date
as (last-two-digits-of-the-year month-number day).
dow (status dow) returns an interned atomic symbol which is the name of
the current day of the week.
daytime (status daytime) returns a 3-list of fixnums indicating the 24-hour
time of day as (hour minute second).
March 3, 1979 ∪3-1.8.1 Page 3-91
Maclisp Reference Manual
system (status system x) returns a list of the system properties (that is,
properties whose values are supplied in the initial LISP system) of
the atomic symbol x, which is an evaluated argument. This list may
contain subr, fsubr, lsubr, macro, autoload, or array if x is a
system function, and value if this atomic symbol is a system
variable.
LISPversion
(status LISPversion) returns the version identification of LISP.
This is usually an atomic symbol.
jcl (status jcl) retqrns the "job command line" from DDT in the PDP-10
implementation. This is used to specify the init file, but
interpretation of the file name is terminated by altmode, and (iN the
ITS implementadion at least) ↓dditional infOriation may follow the
altiode, The init file may wish to examine This information. The
DEC-10 implementation suppoRts two syNtaxe@LAMOdαβ#∂1Ph(∧λHI↓↓:∩α2&NβY↓7+≤a44(J↓↓↓↓ε;⊃↓αrIα2M~A!](λmE*#"AP@(λ M⎇λ⊂-Mλ⊃⊃(∃,,λ
}→<X.M;Y`⊂≤|yz2[yP9z\87y:λ13p∀h syntaxes, hoWever anD
some suppoRp neither. In the MultiCpεAS[AYKKKαsSπ∪L{9βSFKEβK-#@/⊗β\h∞M→#"A∀λ→0≤≤47r2XSr⊂second arguma`≥hAWLAQQJA→%' AG=[[C]⊂X@A←HAKYf∀A]CXASLAQQJ~∀$@A2M~Aβ∞|k7π~ β∪'⊃∧s?QβF[∃β';=βεα,w.n]nG
Hλ
<9(
∞>_1≥.4_8Ye∃J(∩,D⊃∩4j↓ ¬∧Pλ9p`∪ invo-K@AEd~∀4P@$&2M~Aβ↔w3'K⎇mV.wK⎇f∞nT∧&&}tλ&∂∩!Q h⊂α λ∞M→3@⊂
9z0z≥yP5![∀Pε@> (f O h∞@↑ADABαβ@∩λβ"C!!(λ∃
<h⊃N]X⎇~-⎇H~0→H⊂0v9[P:y`%d bi subsysteMq impleme@9iKHA!\@A≠¬GYSg@Ai↑~(∩@A`%GVAk@AiQJ↓CeOK5K]if↓Ie←Z↓iQJAα≠?77∞s⊃β←FK∂!βLs[?/,∧Bπ&YR`H!Q'.ε≡!∩αα∞>F∂'↑4π.~<@∀λ92z:\4εc The nama O`∧AiQ∀AcGβ⊃∨Mβ&K@⊗.>Mw.∧W⊂⊂∩w the ITS
∩@↓S[aYα+7.β]_.M9{@∞
~8h∧
<h∃
(≥<l↑Iph∧∧Y8<nL<@⊂→[0r`%", which IpεAkgβ+π32Hh %↓¬##∃β≡'¬α∂→↓βSF)βG∂,ε"?~
l⊗n
λ≡2απ,ZG∂⊗βY ∩λ1<P∀≤z0z:\P:w0[pTW∧H$s⊂*~2BE∧λ⊂&zv≥4qyP~vx6"[p¬ftatign thic is the us@∃`@∨M∧#↔π(¬Gαα∞⎇w⊗↑≥lrε&≡,V∨&}/∩pH!∀α∧NβH⊂~~2P"'T)P
"@AS[a1K[K]QCiS←8AiQSLASfA∧AYSgP@Qae=PAae=NR\~(~∃k]¬[Bα@QgiCQkfAk9C[JR↓eKikI]fAC8@AS]QKe@;,!βπS}k'
β≥K7?bβ←#?≡)βC;∞k∃↓βM→βS#(h(%↓π+O↔I?→β3?>K9β;∞k∃9↓∧K9βSF)α&R~β'7Cd+7π;&S'?rβS#'~β'MβW+OQβ&C∃↓:αYdlQQ hPQ*ε∞>Tε2kK!⊃⊂Jα∧α3~k∃gαcλ⊃⊃∩αα \↔⊗≡∧ε2bβ↔⊗sHh `H⊃⊃∩α¬MR¬∨≡>F.hQ!PPh!∀ααr∧∧∧Nr∧∧π&FQ∀∧o.NM⊗∨~∧
⊗oεL]V.wL≡FN}d∧απ&
≡2αα
≡2αα
≥bαα∞Mε*αmw⊗n≡APPJ∧
W≡/%jπ⊗},\7"t≥n7&∞l<SZπMRε&}Dπ>NMDε⊗*∞=F∂≡
≤fN.D
⊗2π∞-⊗w"
≡2π/<\Bπ&qQ JαM↔∨εL∨∩π&
≡2rα ≥bπ&T¬$⎇
5Sα
≥Wεf]\Vw&≡M⊗}r∞MεO~
≡2ε∞>NV∞fO∀αε
M↔∨ Q!∩αα∞∞&}R∞∞&}:∀∞&/π,↑6.wM≥f:πMRππ-⎇&.∨E↑π⊗}},⊗nn↑$εw.\,W∩π,≡FF/$∧π&F≥dελh!∀απ∨≥\&}bd∧¬≡.T⊗g≡t¬π∨&≡NW~π↑<W⊗NE∃`hPQ$αα¬MRε6⎇MF␈>≥lrπ∨L≡G/~nVv∨M≥vw~←εO∨D
vvg∀
⊗rπMR¬∧J¬Sα
≥Wεf]\Vw&≡M⊗}raQ hW↑<W⊗NA∀ααG>L↔'/4∞W≡/-≤BJα∞N&N/4∞Fzα∞,W'/-dε∞r
≤F.wM≤fN≡≡M⊗}r∧
v2πMRαπ↑<W∩α≡0hP∀∧ε␈π
}6."∞Mrε∞d
⊗&.nM⊗6N<≡FN}d
v2ε≥dεNw>L⊗v≡T
v2ε
≡2ε⊗]≥f:α
Mv>>\DεNr∃aPPJ∧
FG/4
⊗2ε∀∞W≡/$
↔~εM|v>.D
⊗rε⎇dπ≡/l↑&∞b∞LW⊗n≥l⊗g~D¬π∨&≡NW~α∞]f∞nU∀εn∂⊃Q JαM⊗66↑$ε∞n⎇lrπ&]Rbα.W"α∞>F∂'↑4π/≡↑-⊗"J∞=ε␈.LDαε⊗T∞FF*∞<⊗n*a∀∧Nr∞Mε(h!∀α∧MJ4εNo
LVn.nL↔&N⎇dαπ&
≡2π⊗↑NW⊗w4∧π&FT¬eE,h→T*α≡2ε∞a≥⊗w&↑-f."≡F}n≤1PPJ∧∞7Nn-⎇Brα mw⊗n≥MGJα∞Mε*αk
TtXTαεO4∞FF*∞<⊗n*∧↔~αjYdlT∧π>OM∧π'⊗≥≥FNvqQ JαM⊗>ON4π∨'-≡πε.D
v62a→↔"ε≡4απε}>6N⊗LUBεF}|W6/%Dπ&z<↔/≡T∩εV|$απ&t&(h!∀απ↔]dπ>OM∧ε
εM≤f6/,]g"αk
TtXUbα¬>\'∨O>LVjε≥m↔&N≥M↔V∂M≥vw~∞=ε␈.LDε≡F\=0hP∀∧π&FT∞W≡/-≤BαπMtε&/L↑&nNlTαπ>
≤6Bε≥m↔ Nm≥F/~∞Mrαπ↑<RpL≥dαπ&T¬$⎇∞5SQ!∩αε≥↑εf.\]g&∂M≥vrπM
↔~πMRπ&Tαt=IiS
ε≥lBαtzIdk∩λxU%$_$π6∂-≤⊗⊗f↑4αε∂4⊗ph!∀αε∂M⎇VN~∞?⊗n⊗⎇EBεNd∧π&F←∀ε/F≡>Bbε≥lBε␈MW↔>≡<PNO4∞FF*∞<⊗n*∧↔~α∞>F∂'↑1PPJ∧∞Vv∞\U∩rα∧ ⊗rπMRα¬8→∀bα
≥Wεf]\Vw&≡M⊗}r∞MεO~∧
↔~πMRαπ<≥V*α≡2αG>L↔'/1Q Jα∞]f∞nU∃`hPQ-&v∞\Q∩αα∞>F∂'↑4εVv≥\RJα∞,W'/-n2π&TαεV|$εv∞\Tε∂~∧⊗rε≥nF/⊗l\Bαε≡MvnN4∞7Nn-⎇Bph!∀α¬&TεVv≥\Rε}a≤∩εV|$εO~∧∩π.m≡↔.*
≤F.wM≤fN/$f␈∩∧
↔"ε≥]vv:≥Fbα
|bπ&QPPJ∧∞W≡/$}2εV|.2pL≥dαπ&T∧M%4
⊗oεL]V.wL≡FN}d∞FFO4∧εO~∞Mε*ε-|"?~∧¬dTt→XRαpQ!∩α∧≥dπ&FTλD,~V⊗ααε≥↑εf.\]g&∂M≥vrπM
↔~ε≡4εvviI∃≥αD∧π>F↑,RεvmdεO_≡Mε*ε-| hP∀∧εw.\,W∩ε≥dε&.=≥V∞baQ hW
-f∞nQ∀ααG>L↔'/4∂εVv≥\RJε≥dπ&FT∧∧M%4
⊗oεL]V.wL≡FN}d∞&/'↑-g~πMRαu )dlT∧ε∂~≥`hP∀∧εNwL↑&v.D↔&}]≤2απ?≥V⊗}Edα¬&
≡2αε≡4εv␈-\⊗fg∀∞FF*∧
f∞nT
v2α∞Mε*π∞-v?⊗≥QPPJ∧∞FF∂D∞FF*∞↑6/∩
≥g6}<\Bπ&t∧ε∨⊗\≡F*πM
↔~ε-|"rα
↑7.∞MO∩π&
≡2π>≥MBαε,Tπ&FQQ Jα∞<⊗n*≡2π&TεVv≥\Rbε.↑Bπ≡∀∞W≡/$6∞r
≥g6}<Tπ≡/l↑&∞b=wεN↑4ε}2∀ππ⊗|}&∞hQ!∩αε≡Dε}v<UBε.≤=αεF≡m⊗v:∀απ.m≡↔.*
-f∞nT'/"≥Fbε≡fNvt∞FF*∧∞6∞nT∂εVv≥\Rph!∀α∧Nd∧π&FTλD,~V⊗ααε≥↑εf.\]g&∂M≥vrπM
↔~α∞⎇⊗fb∞,W'/-dαπ&TαεV|$w~α.∞&}?,≥PhP∀∧εv∞\T"rα ⎇b∧o]NFN∨5DεO"∞=ε␈.LDπ⊗/N↑&rα∞>F∂'↑4ε∂⊗tεαJpQ!PW≡\⎇F}8∀∧αG∨L≡G/~∧∞6.>M|rJπ,↑G/⊗n4απ&Tεf}|≡&O&
TααF,≡6*β%∀αε}d∞FF*∧∞6OVT∧ε}2⊃PPJ∧∧'≡.⎇\Vw"%Dπ&FT∞VvOD
v2π>⊗≡*≥Ff}<≡FN}edααEMRπ≡∨,Rε}d∩π≡\⎇V.wD
f..AQ Jα
mw"ε,Tπ&FT∞6∞nT↔~πMRπ≡∨,Rε}d∩εn]]w↔J∞⊗>*e⊃PPh!Q hPQ!PTn≡,6Bβ5DβKw⊃⊂HJ∧∧↓≠~V∃cBs⊃⊃⊂Jα∧∧ααα
⊗>*ε5SK_Q `H⊃∀αα∧\≤6fO>∧¬⊗.l↑&.v<T∧n∞n\⊗`h!Q hR∧∧¬&FTf}fM}vNvt∞7&∂N↑2ε7]l7&N⎇n2ε}mO∩ε/
≡7"ε≥dπ&FT ∃%~
≥Wεf]\Vw&≡M⊗}raQ hV≡N0Jα¬∞7&∂N↑2εON5∩π⊗↑NW⊗w4∩εf≡>Bαε|dε6OlTεO&]↑2αF|.F∞Nl\Bε7-⎇RαπMR¬≥:H∃%(Q!∩απ?≥V⊗}M≤2π∨≡>F.j8⊗fb↔!PPh!∀ααC∃∀α¬&Tαε∞]}Vw"
|bπ&≥\Rαε≥dπ≡.=⎇f'_≡]g&ND ∃%~
≡2αε⎇⎇⊗v:Mw>rD∧ε∂~⊃PPJ∧∧ααα∧ff}n]RbαV∃cαα
≤b∧MJ4αε&|↑6r?D∞εf∞d∞Fzα⎇rε&}⎇b`N}$αk∩f∧αεNd ∃%_Q!∩αα∧∧ααε≥N&.∞O∀εO~Mw>raQ hP∀∧αC∩∀∧ε
εm∨εw.T∞vFNe number of users logged in, as a fixnum.
(4) the number of memory errors the system has survived, as a
fixnum.
(5) the time in seconds the system has been up, as a flonum.
Some of this information may be of use to a user handler for the sys-death
interrupt.
hactrn (status hactrn) returns an atomic symbol indicating what kind of job
is superior to the LISP. Current possibilities are ddt, LISP, t (a
superior of unknown type), and nil (no superior).
The following status functions exist only in the Multics implementation.
paging (status paging) returns a list of the paging-device page reads and
total page reads that have been caused by this process.
arg (status arg n) returns the n+1'th argument of the command which
invoked the subsystem, as an interned atomic symbol. (The first
argument, (status arg 0), is the name of the subsystem.) nil is
returned if n is greater than the number of arguments to the command.
STATUS FUNCTIONS FOR THE WHO-LINE
The following status functions exist only in the ITS implementation.
whol (sstatus whol a b c d) sets four user parameters for the "who-line"
which appears at the bottom of some display terminals. These control
the print format of information specified by (sstatus who2), (sstatus
who3), and (sstatus gcwho). Each of the four parameters specified
Page 3-94 ∪3-1.8.1 March 3, 1979
The System
eight bits of information. Parameters a and c must be fixnums; b and
d may be fixnums or atomic symbols (which represent the ascii value
of the first character in their pnames). Their meaning is as
follows:
a 200 If 1, suppress display of entire who-line.
100 If 1, suppress space between halves of who2.
70 Mode for printing high 18. bits of who2.
7 Mode for printing low 18. bits of who2.
b 177 If non-zero, print between halves of who2 as an ascii
character.
200 If 1, print character twice.
c 200 If 1, suppress space between who2 and who3.
177 As for a, but affects who3.
d 377 As for b, but affects who3.
That is, if the who-line is displayed at all, the user information
appears in the form:
PPP##-QQQQ=RRRR@@+SSSS
where:
PPPP is the result of printing the high 18. bits of who2 as specified
by a's 70 bits.
QQQQ low 18. bits of who2, by c's 7 bits.
RRRR high 18. bits of who3, by c's 70 bits.
SSSS low 18. bits of who3, by c's 7 bits.
## zero to two characters, specified by d.
- space, unless a's 100 bit is set.
= space, unless c's 200 bit is set.
+ space, unless c's 100 bit is set.
The possible print modes are:
March 3, 1979 ∪3-1.8.1 Page 3-95
Maclisp Reference Manual
0 Do not print.
1 Date in packed form:
774000 Year mod 100.
3600 Month (January = 1)
174 Day of month.
Printed as mm/dd/yy.
2 Time in fortieths of a second. Printed as hh:mm:ss.t.
3 Time in half-seconds, printed as hh:mm:ss.
4 Octal number.
5 Decimal number (no "." is printed).
6 Three sixbit characters.
7 Unused.
(status who1) returns a list of four fixnums a b c d).
who2 (sstatus who2 x) sets the who2 varaable to x if it Iq a fixnum, or to
λ the sixbit valqe od the first six characters of the pname of x if it
is a symbol. (stadus who2 x) returns who2 as a fixnum.
¬
who3 (sstatus who3 x! and (status who3) are analoeous tk those for who2.
Example:
↓ (adl numbers in octal)¬
(sstatuS who1 166 0 144 254
↓ (sstatus who2 'FOOBAR)
(sstatuS who3 (+ (LSH 1234 22) 3456))
would cause "FOKBAR 1234,,3456" to appear in the who-line. The geneRal idea iS
that the user should set up who1 hust once and then keep updating who2 and who3
as appropriate. For Exaeple, a routing that processed fUnctions in files might
do
(qstatus who1 1Xl@`@Dll@`$~∃C]⊂A←\A=aK]R9NABA9KnAM%YJAI<~∀α@@@@QMgiCIUfAoQ<d@QG¬Id@QQec]C5JAS]→SYJR$R~∀∩@@@@!ggiCQkfAo!↑f@`$~∀
∃ACOJ@LZrl∩$∩@@@LfZb\`X D$HI↓↓αnK∂!β→1↓EK9d4(0$$HI↓αSF)αOg∨#↔44Ph( (,≥f"ε⎇dε.v=}Vwε↑-⊗v:∀ε'.l>FN}dFxh!∀ααα∧¬π∂∨L≡G/~∞⎇ε{~mfv∞XU⊂hV≥lBπ≡q≤6}wM≥g.␈↑=GJεM≡7εf≥∀απ&Tε6NL]f∞nT⊗v ≤nVv∨M≥vrεl≥V*α,VNvt∞π⊗}<Z7≡.EaPT}lTε∞πl≥g&∞|Tαε}dF}Nlpαπ&
≡2ε␈l↑"ππ-≥g&Nlpλ∧∞~→(
≥Y[|M\=~3mdλ~<d∞~_=∧∧∪∩4j∧_x;AQ]<→≡→(≥m
k;∩-l(~3Lm|[8.M;{H↑Y;H∞M≠⎇9m∧~=λMy<{D}λ~_.l(_smn≤[{∧
yH≥
(_p↔[9wv2Kα
gcwho (sstatus gcwho n) sets the gcwho switchtk n. Curpently only the low
two bits are significant.
The t means that during a garbage collection the who-line should be
usurped to display the message "GC:XXXX", where "XXXX" is the reason for the
garbage collection. On completion of the garbage collection the original user
who-line information is restored.
The 2 bit means that at the end of the garbage collection the who2 word
should be altered so that the low 18. bits get the result of (status gctime),
converted to fortieths of a second, and the high 18 bits get the result of (//
(* (status gctime) 100.)(runtime)), which is the percentage of time spent in
gc. If the user gives 52 octal and '% as the first two arguments to (sstatus
who1), then these quantities will be displaced in the form "nn% hh:mm:ss.t",
just like the standard system statistics for the LISP job. The user can still
use who3 for his own purposes.
Subsystems which use (sstatus gcwho) should perform
(gc)
(sstatus gctime 0)
before dumping out the subsystem, so that the gc time percentages will be
accurate .
(status gcwho) returns the value of the gcwho switch.
MISCELLANEOUS STATUS FUNCTIONS
evalhook (sstatus evalhook t) enables the evalhook feature; (sstatus evalhook
nil) disables it. (status evalhook) returns the state of the switch.
See page 3-31 for the details of this feature.
toplevel (status toplevel) returns the top-level form, which is continually
evaluated when LISP is at its top level. If this is nil, a normal
read-eval-print loop is used.
March 3, 1979 ∪3-1.8.1 Page 3-97
Maclisp Reference Manual
(sstatus toplevel x) evaluates and returns x and sets the top level
form to this value.
For example, to make Maclisp have an evalquote top level similar to
LISP 1.5:
(sstatus toplevel
'(progn (print *)
(apply (read) (read)) ))
See section 12.1 for further details.
breaklevel (status breaklevel) returns the break-loop form. (sstatus
breaklevel x) sets this form. See page 3-6 for how this is used.
uuolinks (status uuolinks) returns a number which represents the number of
available slots for linking between compiled functions. (status
uuolinks) returns nil if no uuolinks pages have been set up yet (see
pure). Otherwise it returns a list of two items. The first is t if
area 2 has been purified (and so no new calls may be put in the
area), and nil otherwise. The second is the number of slots not yet
used in the uuolinks areas.
(sstatus uuolinks) causes all links between compiled functions to be
"unsnapped." This should be done whenever (nouuo t) is done to
insure that the interpreter always gets a chance to save debugging
information on every function call.
divov (status divov) returns the state of the "divide overflow" switch. If
this switch is nil An attempt to divide by zero causes an error. If
the switch is t the result of a divisiOn by zero is the numerator
plus 1.
(sstatuS divov x) sets the "diviDe overflow switch to x.
In the PDP-10 implEmeftation, divov applies only tk quotient. /- and
↓ //$ do not detect divisiOn by zero.
¬
Mar↓ (sstatuc mar cond loc) arms the mar (memory address register)
interrupt (currently available only in the ITS implementation).
(status mar) returns a list of cond and loc, or nil if↓the mar
feature is not in use. See the mar break feature for more details
(page 3-55).
Page 3-98 ∪3-1.8.1 March 3, 1979
The System
features (statuS features) returns a list of symbols representing the
features implemented in the LISP being used. The following symbols
may appear in this list:
bibop PDP-10 big-bag-of-pages memory management scheme
lap this LISP has a LISP Assembly Program loaded
sort the sorting functions described in chapter 11 are
present
edit the edit function described in chapter 18 is
present
fasload the fasload facility described in chapter 14 is
present
↑f the "moby I/O" facility is present
bignum the arbitrary-precision arithmetic package is
included in this LISP
hunk the hunks data type and its associated functions
are present.
funarg the "fake funarg" feature (second argument to
eval, third to apply, etc.) is present.
strings character strings and the functions on them
described in chapter 8 are present
newio the I/O functions described in chapter 13 are
included in this LISP; if this feature is not
present only some of those functions are
available.
roman this LISP can read and print roman numerals (see
base and ibase.
trace the trace package (chapter 15) is present.
grindef the function definition formatter (chapter 16) is
present.
March 3, 1979 ∪3-1.8.1 Page 3-99
Maclisp Reference Manual
grind the file formatter (chapter 16) is present.
compiler this is the LISP compiler (chapter 14) rather than
the interpreter (see also compiler-state).
fastarith the fast-arithmetic features of the compiler are
present
ml this LISP is on the MathLab machine at MIT
ai this LISP is on the AI machine at MIT
mc this LISP is on the MC machine at MIT
SAIL this LISP is running at SAIL
H6180 this LISP is on an H6180 Multics machine or a
compatible machine such as a 68/60 or a 68/80.
its this LISP is on some ITS system
Multics this LISP is on some Multics system
TOPS-10 this LISP is on some DEC TOPS-10 system; or on
some TENEX system since the TENEX implementation
runs under a TOPS-10 emulator.
A package being "present" means that it has been loaded into the
environment. If (status features) claims it is not present, it may
still be available because it may be automatically loaded when
required. This does not apply to the compiler.
(car (last (status features))) is an implementation name, such as ITS
or TOPS-10 or Multics. The main idea behind this status call is that
an application package can be loaded into any Maclisp implementation
and can decide what to do on the basis of the features it finds
available.
feature (status feature foo) is roughly equivalent to (memq 'foo (status
featuRes)), i.e. it determines whether this LISP has the foo-feature.
Note that foo is not evaluated.
Page 3-100 ∪3-1.8.1 March 3, 1979
The System
(sstatus feature foo) makes foo a feature. foo is not evaluated.
For example, the trace package does (sstatus featuRe trace) when it
is loaded.
Example:
(cond ((statuS feature bignum)
(prog2 nil (eval (read)) (read))) ;use first
(t (read) (eval (read)) )) ;use second
(defun factorial (n) ;bignum version
(cond ((zerop n) 1)
((times n (factorial (sub1 n))))
))
(defun factorial (n) ;fixnum-only version
(do () ((not (> n 13.))) ;do until n <= 13.
(error "argument too big - fActorial"
n
'wrng-type-arg))
(cond ((zerop n) 1)
((* n (factorial (1- n)))) ))
nofeature (sstatus nofeature foo) makes foo not be a feature. foo is not
evaluated.
(status nofeature foo) is equivalant to (not (status feature foo)).
status (status status foo) returns t if foo is a valid status function. If
it is not, nil is returned.
(status status) returns a list of valid status functions. The names
are truncated to some implementation-dependent number of characters,
such as 4 or 5.
sstatus (status sstatus foo) returns t if foo is a valid sstatus function.
If it is not, nil is returned.
(status sstatus) returns a list of valid sstatus functions. As with
(status status), the names are truncated to some implementation-
dependent number of characters, such as 4 or 5.
March 3, 1979 ∪3-1.8.1 Page 3-101
Maclisp Reference Manual
1.8.2 Time
runtime SUBR no args
(runtime) returns as a fixnum the number of microseconds of cpu time
used so far by the process in which LISP is running. The difference
between two values of (runtime) indicates the amount of computation
that was done between the two calls to runtime.
time SUBR no args
(time) returns the time in seconds that the system has been up, as a
flonum. The difference between the results of two calls to time
indicates the amount of elapsed real time. (In the ITS
implementation, time that elapses while the system is stopped due to
memory errors is not considered "real" and not counted. Use (status
daytime) to measure true "real world" time.)
sleep SUBR 1 arg
(sleep n) causes a real-time delay of n seconds, then returns n. n
may be a fixnum or a flonum.
See also the alarmclock function, section 1.4.3, and the date, daytime, and dow
functions of the status special form, described in the preceding section.
1.8.3 Escaping from LISP
It is possible to escape temporarily from LISP to execute a command in the
host operating system. Of course, the program (or user) that supplies the
command has to know which operating system it is running under. It is also
possible for LISP to return permanently to the host operating system. This
discards the LISP environment and gives back whatever resources, such as
memory, it was using.
Page 3-102 ∪3-1.8.2 March 3, 1979
The System
in the Multics implementation
cline SUBR 1 arg
(cline x), where x is a character string, executes the MulTics command
x and returns nil. Example:
(cline "who -long")
quit SUBR no args
(quit) Returns from the LISP command, freeing up the temporary sagments
thatwere used to hold the LISP environment.
in the ITS implementation
valret LSUBR 0 or 1 args
(valret) does a .LOGOUT if LISP is a top level procedure, and othersise
valrets ":VK to DDT.
(valret x) effectively performs an explodec on x (in practice x is some
strange atomic symbol like |:PROCEED :DISOWN | , But it may be any S-
expression). If the string of characters is one of "$↑X.", ":KILL ", or
":KILL↑M" then valret perfkrms a "silent kill" by executing a .BREAK
16,20000; otherwise valret performs a .FALUE, giving the character string
to DDT to evaluate as commands.
Examples:
(valret '|:PROCEED :DISOWN |)
starts the LISP running on its own without a terminal.
(valret '| :KILL :TECO↑M|)
kills the LISP and starts up a TECO.
¬
(valret '0$N$P)
causeq DDT to print out The c@=]iK]QfA←L↓CYXA9←\[u∃e↑AY=GCiS=]f∪S8A→∪'@~∀@@@AC]⊂AiQK8AeKiUe\Ai<A→∪'@\~∀~(~∃≠CIGP@f0@brnd∩∩∩@@&fZDXp\f$∩∩@@@@A!¬OJ@f4b`f~(_∩∩∩@A≠C
YSg`↓%KMKIK]GJ↓≠C]k¬X~∀~(~∀∪∪_AiQJ%mCYe∃hAG←5[C]H↓YKCm∃f@As=jAS\↓ (@Q←dA¬]soQ∃eJA←QQKd@↓iQC\↓iQJ~(@@@@↓→∪' $XAB@iπ∨≥)%≥+
@↓←d@I@AG←[5C]H∪Q↑A PAoSY0@AeKQke\AQ↑AiQ∀@A→∪M XAo!SGP~(@@@@↓oSYX↓iQK\↓eKikI\@AMI←ZAi!JAGC1XAi↑AmCYIKh\@↓⊃←oKYKdXAYCYeKP@AIS→MKef↓Me←Z4∀@@@AgkgAK]HA%\Aio<AoCsLt@@A%hAI←∃fA]←PAGQK
VAM←H@A←a∃\AMS1KfXA¬]HASP@AI←∃fA]←P~∀@@@ACYQKdAi!J∪gi¬eiS]≤ACIIIKgf@↓←LAi!J@A→%' \@↓∪L@Ae←jAkMJ@Am¬YeKh↓i↑@A⊃k[`A∧~∀@@@Agk gsgi∃ZXAi!K\AgQCeiS9NAk`↓iQJAMkEgsMiKZA
CkgKLABAe∃ike\↓i↑Ai=`AYKYKXAC9H~∀@@@Ai!JAG←9gKck∃]h@A∃mCYk¬iS←\↓←L@AQQJAi=`[YKYKXAKIeYSgP@@Q]=hAiQ∀@AES9IS]N↓←L~∀@@@A∃eeYSMh@AS8@AKM→KGhA¬h@Ai!J@Ai%[J∪←_AiQJ%mCYe∃hBR\@A+g%]N@AMkgaK9HXAi!J~∀@@@AgUEgsgQKZAgQCeik@A[Ke∃YrAG¬kgKf↓BAeKQke\A→e←ZAQQJAgUgaK]⊂AMk]
iS←\8~∀~∀4∀∩∩∩↓S\Ai!JA)∨A&Zb`↓S[aY∃[K]i¬iS←\4∀~∀∪QQKeJ↓SfAGUeeK]QYrA]<@AoCdAM←d↓→∪' ↓i↑∪e∃ike\↓BAG←5[C]H↓gieS9N@Ai<AiQJ4∀@@@A≠←]%i←d@↓S\Ai!J@A)=!&Zb@@AS[AYK[K9iCiS=\\∪⊃=oKmKHX@@QYCYeKPR@Ao%YXAe∃ike\4∀@@@AG←]Qe←XAQ↑AiQ∀A[←]%i←dAM↑AiQ¬hABA
←[[C9HA[CdAEJA5C]kC1YrAieaKH\A)QK8Aisa∀~∀@@@Aπ∨9)∪≥+∀Ai↑AIKgk[∀A→∪'@\~∀~(∪)QJAeK[¬eWf@↓CE←m∀@ACE=kh@AYCYeKPAC]H%gkga∃]H@A!←YH@↓M←d@↓iQJAQ∨!&ZD`~∀@@@AS5aYK[∃]iCi%←\AC1g↑\~(~∀~∀D\p\hAβII%iS←]¬XA
k9GiS←9f~∀~(~∃gk d∩∩@@A'+ $@bA¬eN~∀4∀∪)Q∀ACeOU[K]h0ABAM%q]kZ0ASfAQCWK\↓i↑AE∀AiQJ↓CIIe∃gfA←_ABAY=GCiS=\AoSQQS\~(@@@@↓BAG←5aSYK⊂A←dAMsgiK4AMk]
iS←\8@Agk dACiQK[aiLAi↑A⊃KiKe5S]JAQQJA]¬[JA←_AiQJ4∀@@@AMk]
iS←\AErA≥e←mK1S]N@↓iQe←UOP@AQQJAGUeeK]P@A←E¬eeCr↓Y←←W%]N@A¬h∪CY0AiQJ4∀@@@AG←[ASYKH↓Mk]GQS←\AAe←aKIiSKf8@A∪L↓Sh@A→CSYf↓ShAe∃ike]L@D}D8@A)Q%f∪Sf↓kgKH4∀@@@AErA CWie¬GJXA→←d@A∃qC[a1J\@AQQSfA→k]Gi%←\A[¬r@AE∀AkgK→kXAi<@Akg∃dAQC9IYKeL~∀@@@AM←HAiQJ↓[CGQ%]J[KIe←dA%]iKeIkahX↓M←dA∃qC[a1J\~∀$A)QJ↓M←YY=oS]N↓Mk]GQS←\A∃qSgiLA←]YdAS\AQQJA∪Q&AS[AYK[K9iCiS=\~∀~)gsgG¬YX∩∩@@A→M+¬$@HAi↑@D`ACe≥f~∀~(∪)QSL@AMk9GiS←8ACYY=of@AQQJ@A1∪' AUgKd@↓i↑AI%eKGi1r@ASMgkJ@↓∪)&AMs[E←1SF~∀@@@AMsgiK4AGCY1f\@AQQJAM%eghA¬eOk[∃]hAg!←kYH↓EJ~∀$∩∩@@@@@@ V@QYMPAF@Dp\RA8R~∀~(∪oQKIJA\A%f@Ai!JAIKMSeKH↓]k[E∃d∪←L↓←kiaUhAmC1kKf@↓C]HAASf@↓iQJA
←]ie=X~∀~(~∃!C≥J@fZD`h∩∩$@@@&LZb\p8f∩∩∩@A≠CIGP@f0@brnd~∀_∩∩∩$@A)Q∀A'sgQKZ~∀4∀~∀@@@AE%ifAM=dAiQ∀AGCY0\@A)!J@Ag∃G←]H↓CeOk5K]hAMQ←kY⊂AEJA¬\ACi=[SF@↓gs[E=XAoQ=gJ~∀@@@AA]C[J↓Sf@AQQJA]¬[J@A=LAiQ∀@A∪)LAgsgQKZ@A
CYX\A)QJAeKgPA←L@↓iQJA¬eOk[∃]if~(@@@@↓gQ←k1HAEJ↓iQJA%]akh↓CeOk5K]if↓M←dAQQJAG¬YX\@↓β\ACIOk[K9hA[CdAEJ@↓BAMSa]kZX4∀@@@A←dA∧AMSY∀A←EU∃Gh@@!M←dA]QSGP↓iQJA→SYJOL@AGQ¬]]KX↓]k[E∃dASf↓kgKH$\∩A∪_AiQJ4∀@@@AGCY0AgkG
KKIf0ABAY%ghA←_A\@A→Sq]k5fASf↓eKikI]KH\A∪LA¬\AKeI←d@A=GGkeLXAiQ∀~∀@@@A∪)LAKee=dAG←⊃JASf↓eKikI]KHA¬fABA→Sq]k4\~∀~(∪qC5aYJt@@QgegGCY0@`@OMG[XAQsR@f$~∀∩@@@Ag∃ifAi!JA]k5EKdA=LAKG!↑AYS9KfAM=dAiQ∀Aiir↓i↑@f↓C]HAIKike9f@A]%XA←\4∀∩@@@Agk
GKgf8~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~)≠CeG @fX@Drnr∩$∩@@@LfZb\`\h∩∩$@@@@A!CO∀@fZb@j~∀_∩∩∪ACeh@P@ZA)!JA→∪M Aπ←5aSYKH~∀~∀4∀~∀b8@A!K
kYSCISiSKLA←LAQQJAπ=[aSY∃d~∀~(~∀@@↓→∪' ↓ae←OIC[fA
C\AE∀AG←[ASYKHAS]i<A[CG!S]JA
←IJ\A)QSLAeKaIKgK]QCiS←8@A←L↓B~∃aI←OeC4ASfA5←eJA
←[aC
hAiQ¬\AiQ∀AS]i∃eaeKQKHAY%gh[gQekGiUeJAe∃aeKg∃]iCi%←\XA¬]H~∃%hAGC8AEJA∃qKGkQKHA[UGPA[=eJAcUSGWYd\@A⊃=oKmKHXABAAeSGJ↓[kgh↓EJAa¬SH@A→←dAi!KgJ~)EK]K→Sif\A∪hA%fA]←PACfA∃CgrAQ↑AS]QKemK9JAS\↓iQJA∃qKGkQS←\A=LAG←5aSYK⊂Aae←≥eC[f4∃CfA%h@ASLAoSi ∪S]i∃eaeKQKHAaI←OeC5f\@AQQkf@↓[←gh↓→∪' %ae←OIC[fAMQ←kY⊂@A]←PAEJ~)G←[a%YKHAU]iSX↓CMiKHAiQKdAQCm∀AEKK8AIKEUOOKH8~∀~∀@A∪\ACII%iS←\0A]←hACYX↓→∪' %ae←OIC[fA
C\@A JAG←5aSYK⊂\@@AQQKeJACeJ↓GKei¬S\~∃QQS]OL∪oQS
PAGC8@AEJAI←]∀AoSi @AiQ∀@AS]QKeae∃iKdAQQCh@↓GC]]=h@AE∀AKMM∃GiSm∃Yr~∃
←[aS1KH\@↓)QKg∀AS]G1kIJ@↓S]ISMGeS[%]CiJ↓kgJA=L@Ai!JAMk9GiS←9fAKm¬X@AC9HACaAYrX~)KgaK
SCYYd@AoSQPAaI0[a←S9iKd@↓CeOk5K]ifl@E]←9Y←GC0D@AkMJA←LAiQJ↓O↑@A¬]HAe∃ike\4∃Mk]
iS←]Lv@AMU]GiS=]fAo!SGP@↓[←IS→r@Ai!K[gK1mKf\AβYg<∪iQKIJACe∀@AB@↓]k[E∃dA←L4∃Mk]
iS←]LAoQS
P@AI∃iKGh↓SYYK≥CXACIOk[K9if@A]QK\AQQKrA¬eJ@A
CYYK⊂AS]i∃eaeKQSmKYd~∃EkPA]←h↓oQK\↓BAGC1XAi↑↓iQKZ↓SfAG=[aSY∃HvAi!KeKM=eJAKroneous compiled programs
can damage the LISP environment and can cause strange errors to occur - be
forewarned. However, most "normal" programs are compilable.
Some operations are compiled in such a way that they will behave somewhat
differently than they did when they were interpreted. It is sometimes
necessary to make a "declaration" in order to obtain the desired behavior.
This is explained on page 4-11.
1.1 Variables
In the interpreter "variables" are implemented as atomic symbols which
possess shallow-bound value cells. The continual manipulation of value cells
would decrease the efficiency of compiled code, so the compiler defines two
types of variables: "special variables" and "local variables." Special
variables are identical to variables in the interpreter.
Local variables are more like the variables in commonly-used algebraic
programming languages such as Algol or PL/I. A local variable has no
associated atomic symbol; thus it can only be referred to from the function
that possesses it. The compiler creates local variables for prog-variables,
do-variables, and lambda-variables, unless directed otherwise. The compiled
code stores local variables in machine registers or in locations within a
stack.
October 2, 1979 Page 4-1
Maclisp Reference Manual
The principal difference between local variables and special variables is in
the way a binding of a variable is compiled. (A binding has to be compiled
when a prog-, do-, or lambda-expression is compiled, and for the entry to a
function which has lambda-variables to be bound to its arguments.) If the
variable to be bound has been declared to be special, the binding is compiled
as code to imitate the way the interpreter binds variables: the value of the
atomic symbol is saved and a new value is stored into its value cell. If the
variable to be bound has not been declared special, the binding is compiled as
the declaration of a new local variable. Storage is assigned and code is
generated to store the value to which the variable is to be bound into the
register or stack-location assigned to the new local variable. This runs
considerably faster than a special binding.
Although a special variable is associated with an atomic symbol which is the
name of the variable, the name of a local variable appears only in the input
file; in compiled code there is no connection between local variables and
atomic symbols. Because this is so, a local variable in one function may not
be used as a "free variable" in another function since there is no way for the
location of the variable to be communicated between the two functions.
When the usage of a variable in a program to be compiled does not conform to
this rule, i.e. it is somewhere used as a "free variable," the variable must be
declared special. The necessary special declaration of such a variable
provides a convenient place to put a comment explaining and and defending its
non-local usage. There are two common cases in which this occurs. One is
where a "global" variable is being used, i.e. a variable which iq setq'ed by
many functions but Is never bound. The other is where two functions cooperate,
one binding a variable and then cAlling the other one which uses that variable
as a free variable,
Page 4
2 ∪4-1.1 October 2, 1979
α
1.2 In-line (or OpEn) Coding
Another difference betweeN the compiler and the interpreter is "in-line
coding," also called "open coding." When a form such as (and (foo x) (bar)) is
evaluated by the interpreter, the built-in function and is called to perform
the desired operation. Bqt to compile this form as a call tk the function and
with list-structured arguments deriveD from (foo x) and (bar) would negate much
of the advantage of compiling. Instead the compiler recognizes and as part of
the LISP language, then compiles machine code to carry out the intent of (and
(foo p) (bar)) without actually calling the and function. This code might look
like:
pick up valua of variable x
call funcTion foo
is the result nil?
if yes, the value of the and is nil
if no, call the fUnction bar
the result of the and is what bar retqrned.
This "in-line coding" is done for all special forms (cond, prog, and, errset,
setq, etc&); thus coMpiled code will usually not call any of the built-in
fsubrs.
¬
Another difference between the compiler and the interpreter has to do with
arithmetic operations. Most computers on which Maclisp is implemented have
special instructions for performing all the common arithmetic operations. The
Maclisp compiler contains a "number compiler" feature which allows the LISP
arithmetic functions to be "in-line coded" using these instructions.
A problem arises here because of the generality of the Maclisp arithmetic
functions, such as plus, which are equally at home with fixnums, flonums, and
bignums. Most present-day computers are not this versatile in their arithmetic
instructions, which would preclude open-coding of plus. There are two ways out
of this problem: one is to use the special purpose functions which only work
with one kind of number. For example, if you are using plus but actually you
are only working with fixnums, use + instead. The compiler can compile (+ a b
c) to use the machine's fixnum-addition instruction. The second solution is to
write a form such as (plus a b (foo c)), but tell the compiler that the values
of the variables a and b and the result of the function foo can never be
anything but fixnums. This is done by means of the "number declarations" which
are described on page 4-11.
October 2, 1979 ∪4-1.2 Page 4-3
Maclisp Reference Manual
Another problem that can arise in connection with the in-line coding of
arithmetic operations is that the LISP representation of numbers and the
machine representation of numbers may not be the same. Of course, this depends
on the particular implementation. If these two representations are different,
the compiler would store variables which were local and declared to be numeric-
only in the machine form rather than the LISP form. This could result in
compilation of poor code which frequently converts number representations and
in various other problems. Compilers which have this problem provide a (closed
t) declaration which inhibits open coding of arithmetic operations.
Page 4-4 ∪4-1.2 October 2, 1979
1.3 Function Calling
Another property of compiled code that should be understood is the way
functions are called. In the interpreter function calling consists of
searching the property list of the called function for a functional property
(if it is an atomic symbol) and then recursively evaluating the body of the
function if it is an expr, or transferring control to the function if it is a
subr. In compiled code function calling is designed according to the belief
that most of the functions called by compiled code will be machine executable,
i.e. "subrs": other compiled functions, or built-in functions, and only
infrequently will compiled code call an interpreted function. Therefore a
calling mechanism is used which provides for efficient transfer between
machine-executable functions without constant searching of property lists.
This mechanism is called the "uuo link" mechanism for historical reasons.
When a compiled function is first loaded into the environment, it has a uuo
link for each function it wilh call. This uuo link contains information
proclaiming that it is "unsnapped" and giving the name of the f∃nction to be
called, which iq an atomic symbol. The dirs@PAiS[∀ABAG¬YXASLA[CI∀@AiQI←kOP↓ckGP4∃BAkU↑AYS9VPAi!JAMβ
hAiQ¬hASh↓Sf@EU]g]CAaKHD↓SfAe∃G←O]%uKHA¬]HAB↓caKG%CXAY%]WS]≤~∃e←UiS]J↓SfAK9iKeK⊂\@A)!SfAe=kiS]∀AgKCIGQKf↓iQJAAeWaKIibA→%chA←_AiQJ↓I`↔;≤εFN}d
Fxh,,Rε≡≥IF."@
⎇zz3LT→[`→λ0P# 5nctionadAeWaKIib@Q=`AC\↓Cki←1←CHAAa←aKIibR∪αK9β+/≠P$.Mε*π<≥V*α∞|↔Jε_4π&FT∧εNwLZ'π⊗↑LWαπ⎇x
-L Hλ ≤β⊂⊂*~2P3unctiOn teRns Out to be an~∀∃qadX↓←dA∪β→βWh →,@4s2@$, the inteppreTer @Sβ→βGO,!↓βSzβπCCdπ∩π&Tε'9X`~~ww∧p[2⊂:4→FE92\zv: is given backt`∞Ai!J@AG=[aSY∃HAG↑α#∃)↓¬##∃↓∧c';-∧K@~εL\gαα∧.Vw≡l≡πε.D$π≡xQ*FF∂@λW6//∀απ&≥\Rπ&
~2αεnYf∨&≥ybεO46∞fL\BαπMRεNnLW↔π,↑F/∩∧
vNfD&*α
⊃g6}<XBπ&qQ&NwLZ'π⊗↑DεO'4λF.6≥m↔&N⎇ebαα _bbε
}v/6↑!Bπ&Tαε7]l7&N⎇dε⊗.≥lrε≡≥MF."∧ ↔
ε\≤6FNlQPV/X7/&≤-F*α¬⊂O∨\."J@λ≥~Tλ≠∀[5P⊂4\P⊂⊃9[0x8"Y↔⊃⊂⊂⊃|0qz≠<P⊂;Z0z⊂⊂≥44yPλ6rpw≤P4yFB4vx6→vrw:_z4wwλ22x2[22w:λ1:z⊂≥42P2Y32qzλ4yP:~0z⊂3≤7vP7≠{P7wλ;t2w→{2y⊂_Dqpv≠⊂4yFB6pr2H:497]st⊂:~4yP:]wP64[5P⊂1[w:97[⊂;tv≠⊂12P≥90w9Y2y92Y⊂24y→qz6<H:7P⊂≥42P1Xv62rβE3:w_z4wwλ:ytw→P:42H9zq9≠zz4w→Vqpv≠4w3Pλ4w9z≤:qz4[w⊂7sλ:42P≠pqt4[2V⊂⊂_w2⊂7→tz42\εE:4→P64w~tw3P≤7zz4[2P77\⊂:42H4w:2\892z→y⊂;t[6⊂12H1pv6→r↔εEβE⊂⊂⊂∃42y2H4yP0H360sH;t4qZ⊂1pwλ12P⊂≤rz⊂9[P:40]⊂64w~yP;t[6⊂77]⊂12P≤w0x8→r∧r{→w⊂4sβE:42↑P3wP≥7P0P→:w1z~ww⊂;Z4qt⊂λ4yP6Xqt4w→P2|2Xzz0q≠2W⊂⊂∃44yP→60sP~yP:4→P⊂;0[:rP7YεE:4→P0z7[tqP9↑vq7vλ⊂77z]wW⊂⊂
)rrP≤0y:⊂W~W∀H⊂*42\2P4yH0v9wH0P⊂3≥w1z4[w⊗⊂∀≤yz0z≥yFE:]wv4w~yTV⊂≥t4qtλ:w9w_x9P⊂_v6⊂:~2P64[5yP⊂~w⊂:4→P2w;~y7w6Yw:↔⊂λ⊂*42\rP30Xtv4z~ryFE_y2P:\rr⊂⊂~w⊂1t\1zvy]0w1r\P9zqZ⊂⊂0yH;t2wλ0P⊂1[vx4v→r⊂3:[1z4w[⊂4yPλ92r2Y4w2r⊂7yεB1wvx~v2r⊂_wr2P~yP12Zw3P:≤0qrrλ7y⊂7]42y;ZyrP2→q:ssYr↔εEβE⊂⊂⊂∩w⊂:4→P⊂82≤⊗XX⊂~vx62[rw:0]4ww⊂_P⊂:z[P64w~P4yPλ4vx6→vrw:→r⊂0yH⊂0w⊂~w9z9≥qz4w[εEεEβE'qz≠q2y⊂⊗⊂_\M\DDDH⊂⊂⊂ M⊗XW→BDDDh_srP~ZFEβ∧DDPλ⊂&pq[4yx⊂∀2s2y→w1rP∪pw:p[εEεEβE;t4Xt⊂4yH2|2q]z2r⊂≥t2w⊂_P1pv≠⊂⊂4yH:7P1→P6pr→P:49≠zst⊂≥42P6~w5W∧H w⊂⊃≥w9w0\82r⊃βE64w~P1ww≤tyz9H7s⊂⊂_P9x2Xtpv⊂~w9z9≥qz4w[⊗⊂⊃*UgQ⊗⊂λ;t4qZ⊂1pz\ryP:~2P⊂&∩ih⊂6~w5tw→FE97]z4w2H4w⊂:~2P4w≥2y89→z2y⊂≥7P12H⊂1pv≠2r↔⊂λ*42P_r292\yP34Yv2⊂7Y⊂:42H⊂:zwH87tw≥9FE:≠P:42H0z7vZqP9|[q7v⊂≥t4qtλ70vr\P:42H3:w1]4ww⊂≥7P12H1pv6→r↔⊂⊂∃42P7\2y0z~ww⊂1[r2FE_w2⊂0Xqzvz[0z7yλ34rv→9P4w→4qpz→P:42H:<x2H7s⊂1Xv6⊂0[2⊂7:[q2y⊂≠s⊂0y→zvrw≥9W⊂⊂∃t2wεB:42P≠4w5P~yP9w_x82rλ:42P∃jgP4[9z9:Xz4wwλ4yP9→x60qYr⊂;t]4⊂0Pλ(*id∩⊃⊂4w≤z9:q]4ww⊗βE;t4Xt⊂4yH:42P≠pqt4[2P4w≤z9:q]4ww⊂→7y⊂1Xv64w→P9zq≤7zz4[2yWεBεE⊂⊂λ$w⊂:~2P&z[:4qyH4vx6→vrw:_z4ww⊂0P⊂≥zwP6~w5P4\P4vx≠2vrw≥2r⊂0\P0P⊂≤7tw:→y↔⊂⊂∃7FE1Xv6⊂:~97zsZ⊂:44\P⊂64[5P0Pλ:9x1≤⊃⊂4w≤z9:q]4ww⊂λ4w24\2qz⊂≥497zYt⊂:4→P⊂87Zw:2yλ4yFE≥yrr↔λ⊂ w⊂≥w9w0\82r⊂≠4w5P≤7tw:≤P0z⊂≥42P6~w5tw→P9zq≤7zz4[2P0w→⊂;0y~wzyP→4rv2≤P4wεB:42P≤7tw:→y⊗⊂6→s:⊂:[:yrrλ1<P:~2P⊂6Xqt4w→V⊂4w→4qpz→P:42H:<x2H7s⊂1Xv6⊗⊂λ7:vq→y⊂7sβE0y3]vrw:≤V⊂0w→⊂:42H⊂0z7[tqP9↑vq7vλ;t4qZ⊂70vYyP⊂:~2P3:[1z4w[↔⊂⊂+Z2w⊂:~2Dv4[5P4yCE9w0\82r⊂≥42P8≠tw:2\⊂4yP_t0w3Yr⊂:7H87tw≥⊂0z⊂≥42P3~y9z⊂~w9z9≥qz4w[⊂7s⊂λ:42P_pv62YεE3:[1z4w[↔εEεB⊂⊂⊂!→s7y2H0P3:[1z4w[⊂1pwλ12P:\rr⊂4]⊂6zy]⊂12P≠pr2P~w7{wλ4w⊂:~2P&$Th⊂2w≥4y7w≠rw:↔βE$w:→y892]2r⊂3≥w1z4[w9P0\2P6pY2P5w≠{w⊂9Zvx6<H1<P8≥z:4w→P0P3≥w1z4[w0v⊂≤97x2\:<P7[εE:4→P⊂89≠x2y:≡P64y]⊂⊂7sλ:42Pλ0z7vZqP9|[q7v⊂λ;t4qZ⊂70vYyDz4→P3:w_z4ww∧j44\P4yFB:yzp[6<P2≠w2P⊂≥ytw3H:42Pλ1:tv≥⊗tw⊂→:w1z~ww⊂2→s:w↔λ⊂⊂!w[x4v2Y⊂3:w_z4ww≤Dvzy]⊂12FB6pr2H⊂5w7]w⊂1<BpP6w\2Dqw[x62|λ6rqt_w4yvH⊂5w7]w⊂0yH⊂⊃67Xr4w3K⊃⊂12XpzyrH⊂7s⊂≥42FE_wvx6→|4z<H7s⊂:~2P9z\87y:λ6rqt_w4yv\P72rY2r⊂:≠P6puYP1wv\4v2rλ⊂3:w_z4ww≤P2|2Xzz2FB2s34Xtrw:≠<W⊂⊂∩w⊂⊂9[vrP2~pv2q]9P⊂7Y⊂&$iT⊂:42H⊂1wv\4v2yλ0zz7[pz4qXv6<Pλ6pur\P:42CE1wv\4v2rλ3:w1]4ww9Hthe compiler creates a file in the
file system of the host operating system, and this file has to be loaded before
the compiled function can be called. In the pdp-10 implementation this file is
called a "fasl file." In the Multics implementation it is called an "object
segment." Loading is described in detail on page 4-17.
Page 4-6 ∪4-1.3 October 2, 1979
1*4 Input to the Compiler
The input to the compiler consists of an ascii file containing a number of
S-expressions. The format od this file iS such that it could be read into a
LISP environmeft using a function such as lkad or uread, and then the fUnctions
defined in this file would be executed interpRetively.
When a file ic compiled, the compiler Reads succeqsive S-expressigns from
the file and processes them. Each iS classified as a function definition, a
declare, or a "random foRm"↓according to what type oF object it ipεAC]⊂~∃CG
←eIS9NAi↑↓SifA
CdAS_AShAαKEβ¬∧c'OQph(4)α↓α¬β5+;∂SN{9↓β&+∪';LεFN}d
↔4λ_(m|[(∧∞z≠|lT_x<D∧~<hL9];D∧≠|HL9\≤M}B( ≤H≥~Q"Y]-l⎇~;md→→9M≥Y<h∀≠88n-kλ∃
(≠8,>[h~.4→→9M≥Y9λm|H≥.<(_=∧{{<
≥→(≥
≥9+H∧∧∩9H
≡β"Y\Z;Y.4_;H←≤≤H
}H_(L>≤≤ED≥~→${{<
≥→<H∞NX;\mL=→<d∞~→(L9Z;M≡~;{D\[{$ ∩4t∧∞≠c"M\8z~-l(_{lL(_;LD≠⎇=∞∞=≤h
≡λ~;NMhλ≥
(λYL≡{λ→M≥→(H
}Hλ[l-Y8⎇∧∞y9{,]]λ@∧∞z~8m∧~<c!.~→(
}=≤≥.D→\[mT≥~→${{<
≥→<KD∧∩9H
≡λ→→,m;Y<d∞{{9$
⎇~→.$≤≤[n<]≡%D~=λ
≡h≥≤L\=→9↓QX<h∀≤X;LM{(→M}[+C!!"Hλ∧λ(≤X-l≠{(m|[(
≡hλ_-o=~~-lh≤Y,≤λ→\M⎇(≥~T~;\∞↑λλ→M≥→(≥
=λ~.4≠[⎇∧∧_(→N]X⎇~-⎇C"Y\Z;Z.M;{H
}Hλ_$→8{≡Y+H∧∧∩=λ
≡hλ≤m≥<≠≡${|~,\λλ~-n≠h≥
(λ≠n↑≤≥=∧Z;→$∧≠yH∞M→#"L={<~-L<H~-d≤⎇8m∧_(≥l∨(≥~≡λ≥z]H≥~≡λ→Z-L(~<d
≠x9\λ~=∧∞z;≠∧Y(→.l;≥8.L9C!!"Hλ∧λ(→→,=_<Y$∧~<h∀λ→[n-(≥z
}y(_l≡Hλ~.4≥~→$∧_=≠mT→→8mL<Y+D∧∀y9!∀→[|D
≠⎇h∧
=λ~.1"\≤M|y<|l\λ_↑$∞~→(={<~-L<KH∧ =α:.4~9{M}Y9λ/(≥~T~;]↑\≤Y.L<H_L\x=<lTλ≥~↑Y(~.1"X;D\⎇8N$_x;
L9λ→\{_<LT~;H \8{~.>λ≥z
≤zλ→
|<h≠M}~~;LuC"C!$λλ∪M}→(≥
=λ~,d_(→M}[(~.4≤Y8,D→\[mT≥~→$
;\≥.D→Z;T_;Y∧
=≤h<<H~≡h_Y,]H→→,m;Y9↓QX<h∀≠88n-kλ≥
(_{m↑~;→.$≥z;
D_<≤
O(≥~T≠88n-h_;LD≥~→-d≤≤[l<<|h∞M→(≤L↑⎇;≥∧<h~,a"Z=∧
_9λ,9;H∧∞Y89∧\[{$∞~→(
≥\≥=∧∧→Z;UHλ∃
∞<h~,d→[{d∧~<h∀≠88n-hλ≥m
8zλ←≤_;LNc"Jm{h_!≤H_j$∧~;]
t
→→,n;Hλ∀KKE∃λλ≥
(≤Y.>;≥~-lhλ→N]X⎇~-⎇H→→,m;Z=
≥{B=m≥≠λ_LQ"X{m↑~;→,EC"C!!"C"AQC"C!!"C"AQC"C!)x⎇≠l,<HED.-g⊃""(∧∧λ∧m¬V+Mα!⊃"4_,|(
&q"@↓A""(∧∧∪88mM<|λ
,9Y<L]Xy( \;]8-A"C"AQL+M$∧∪⎇=∞∞=λ≠ld≥~→$λ{{<
≥→<C!!"C"D∧λ∃~T≠⎇=∞∞=λ≠ld≥~→${{<
≥→<H∧
[|[,≥≠≡(={\z.>≤h≠ld→<\M}H_;LDλ≥x.-Z;Yd
9<|l≤y<c!-{H≥
(≥→.-:;X-Eλλ_-lλ_(m;→(
|Hλ≠,≤z~;LT_{yT≥z~,=λ_x-dλ_Y$
≠x9\λ~;NMhλ_$
~<|↓QY;]M≡[{[,]]λ≥m≡~λλ
Mx9λ
}Hλ→L≡{≠x,EHλ∩-dλ≥~T≤→≤¬V,λλ
≥<≠→-\;]_.M;{H
≡α:<d;≤{aQ\≠|n=8[→$∞≠h→l↑λλ_$∧[_<∧Z;→%dB5~
≡h~<d(→Z-L"=z
≤zλ_m⎇]_:-nh≠8,=~;Y!≤{y→$
;C"N?;8[mM8h→M}[+C!!"Hλ∧ ;Hλ∞M→(λ ↑;≥~,>hλ~-↑≠→;,]]_=
≥{H≥
(λ_m⎇<~;↑Hλ≤∞-y≥8l↑hλ_!≡⎇_;LL<Yλ
|ZY8nA"\y,⎇9;]∧∞z=~∧"=≤L≥\{_.M|H≠L≥9(≠ldλ[~.>λHλ≥Yλ_$∞};8M⎇λ≤y,>~;{D∧≥z~,=λ_{mn_:;N1"]~T~;YM}[8=
≥{H≥.<9λλ/(≠≠l≤λ≥≠d→9Z-l(λ→N]X⎇~-⎇\kλ∞<=λ≥.∧_{{N>_;]∞4λ≠Y,\→9λ/#"]
(_{m↑~;→,D_{yUλ_|L\=→(∧.=;h
M;Z|d%λ→=5C"C!$λλ∃m;Hλ∞M→(λ
|ZY8nDλ≤y,⎇9;]∧
<hλ∧-≠x9\λKλ∧
=λλ
≡h≠[nDλ_{n
99λ∧
;]≠d∧≥~→$
~<|↓QY;]M≡[{[,]]H∧∧∩;\nL89λ∀λλ[
≥Zx9lTλ_[
|zhH
≡hλ≤l↑λλ≥.∧~;H∧∞~→",]]Z<M⎇[9;ND_;Y↓QZ;Z.M8;~/,9λλ≤x{|LM;Yh∞Mhλ→
≡Y8⎇
≡Y<h
≥Hλ≥
(≤y,⎇9;]∧}hλ≤o≥8[{∧∧≤y8nM;{KD∧∃~~.1"X[
|zh~-l{≥9↑h≥~T≤Y9L↑Y;XlTλ≠X-\(≠yD∞~→(
|ZY8nDλ≤y,⎇9;]∧;Yλ∀≤≠z-n→<H∧∞≠h~.EC"U
∞<hλ={<~-L9α8m|→(~.4λ_=.M{8=
≤x;≠∂⊃<z_.,9λ_L↑≥y9-a;=;∞M<≠→$∧≥<y..hλ~-d≥~→!QS=;∞M8|h
≥<≠→-\;]_.M;{KD∧∩≠⎇l↑Y<K∧
~<⎇∧∞⎇≤],>≥<Y${{\nL;]≤d∞<y9∧↑(≥
(_{m↑~;→,A"X{lL(_x-d≠Y=L↑H_Y$∞z_<L\C"AQHλλ ≥H≥~T≤→≤¬V,λλ
≥<≠→-\;]_.M;{H∞M→(≠n↑≤≥=∧
yB=
(_{m↑~;→.$~<h∀λλYL≡{λ→M≥→+HAQU~~.4→Z;T_Y9m≥\hλ∞⎇=~λ∀~→8,L<Hλ
≤→;]
≤↑:;Lt~=λ≡hλ_$X<{∧Z;→$∧_;Y∧
;Y~,<=~;Lq"]z≡λλ≥L↑\z;mdλ≠yD∧≠~<n∧λ~=∧∧≥x<d∧≤≤[lN8y9∧∧→[|Edλλ
M~<h∧
<hλ∞↑y9λ∧∧≥≠h∧→=→,>β"Z-l{{<≡~8Z-M=~9.5J(λ
M→(≤L↑⎇λ≠ld≥~→$Z;→${{\m≡⎇≤h
|H_(∞<<Z9.4≠yHM<Y8nM=Y<d∞≠c"MMx9λ≥Yλ≤L]≠xx.L(_{lL(≥{n,≤kλ∞<=λ≥.∧≠~<nE<⎇≤N\⎇≥<LT_{{N>_;]∞5α<Y,l<Y;L<(≥X-N9#"L<;≠≤d
yH≤o≥8[{∞5λ→=L≥≥8=T≤X;LM{(∀e\>≤≤L↑|z;mnkλ→.LkC"AQHλλl<{≠l≤λ≠|↑X=→.4_↑(∞,89~-lh≥~∞-⎇9z∧∞~→(m;→+∧∞⎇≠|M≥Yh_m|→(~-dλ≠~.> |h-;X<O⊃"\≤M||X;$∞|_8lUλ_;LD→y;L↑X=~-lh≥~T≠Y8l↑|x<O∀∪∩4j∧≠xZL\⎇≤hm|H_m⎇\⎇_-n≤b=.<9λ_O⊃"]~T_{{.
;→9∧{y→%dλ∪[n-8;≠∂∀≠[{LT≠yH∞M~<h
≡h≤z≡Y9λ,=≥y,]H≥<l↑\kλ.=λ≤l\(≤_,|#"LeVMh→M}H~;Lm|[8.M;{H
⎇H~≠nt≥≠h
\:y(
≡λ≤≥.,(_;LD≤z_.,9C!!"Hλ∧
~→<LT~<h∀→];L>~;{D→9Z-l9λ~-dλ≥~T_{{.
;→<ED_{⎇.N≥=∧∞z~8m∧_x;DY"=.<9λ≥
q"\≥.D_(≤L≥Y≠{$
k9>∞∞Y<|m≥{H~-n≠h≥
(≠⎇.N≥=λm;→+D∧∃z→-d≥~→$Z;→$
<hλ
Mx9→,Eλ≥~
≡c"Te\>≤≤L↑|z;md≥z;
D_Y(↑X;≥,≡→9D∧∃~~.4λ_x-d_Y(∞↑y9λ∞Mh≤≤M≥]λ∃
(λ≥L↑\z;md≠];,,<C"M|H≥~Q<≤[l}X;+∧
;Z=
≤;~>LTλ~=∞4→_=∀λ_X.<+λ→.LkHλ∧ =λ_l≥[[⎇∧∧_Y(∞↑y9α.Mh→[m⎇β"X.-⎇;Y∧∞z=~∧
xX<N,><h,8x=.<(≠yD∞~→(∞|>(≥
(≠≠l≤→<H
;Y≠↑h_=
⎇:8h∞?;8[mNnHλλm|C"L\YZ8m≤;X}%D~=λ.:;→∞4_(≥≤[→(
|H_;
D≥~→$=≠{.4≠Y9,L9λ_O∀≥~→$Z;→$Y:;Lt≠≠x,L9β!,;Yλ>Y8=↑h_;LDλ~;NL<[\d∞~→;$;≠λ
.<⎇α-⎇Xy+D∧∃~~.4≠8:l↑h≠≠l≤~;Yd∧≠=8m∧→X<nL<Kβ!,]=λ
\8;\d∞~_=∧=Y4O≡~~;Lt~;H
⎇Y(→M≥→(~≡h≥≠d{h≠md≥~→$∞x;9$
xX<N,>+C!!"C"J9y(εE.α"!∀λλλα6,+FQ""( |⎇≠xL↑HK∧ε.-n!Q@↓A C"D∧λ∃~T_{⎇.N≥=λn;X⎇
≥{Hλ∞↑⎇8;
O(→≠l↑h≠[nD~_=LQ=≠h,(≥<l\λ≤m≥Xy(∧∞~→(={<~-L<C"L=⎇=≤∞↑≤hλ≥↑(→M}[(λ
≡λ≤Y,≤≤hλn[{(∞M→":-n≥=λM;→(∧∞~_=∧≠y<d∧≠[⎇∧
≠{zd∧≠~:lT_#"LL8{_.,=~;mdλ≠|D(λ→N]X⎇~-⎇Hλ→\Z;Z.M;{KD∧∩=λ∧
<hλ∞∞[⎇Z,L9λ→M}B=~Tλ_Y-l9Z5∧
yC"L<<U_-≥H~_-≡↑(∪,≤|[|ea C"AQC"C!!"C"AQC"C!!"C"AQC"C!!"C"AQC"C!!"C"AQC"C!!"C"AQC"C!! C"AQC"C!!"C"AQC"C!! SxnMxY<DεKλ'⊗n""!∀λλλα6,+FQ"""*9y(εE.#"@ Maclisp Reference Manual
1.6 Functions Connected with the Compiler
declare FSUBR
In the interpreter, declare is like comment. In the compiler, the
arguments are evaluated at compile time. This is used to make
declarations, to gobble up input needed only in the interpreter, or to
print messages at compile time. Examples:
(declare (special x y) (*fexpr f00))
(declare (read)) ;in compiler, gobble next S-expression.
(something-needed-only-in-the-interpreter)
(declare ((lambda (↑w) (princ "Now compiling fubar"))
nil))
%include FSUBR
(%include name) is used to cause an "include file" to be included in the
input to the compiler. It works in the interpreter also, causing the
specified file to be inpush'ed. name may be a string or an atomic symbol.
The translator search rules are used.
Note: this function presently exists only in the Multics implementation.
See also the nouuo switch, part 3.5.
Page 4-10 ∪4-1.6 October 2, 1979
Declarations
2. Declarations
It is often necessary to supply information to the compiler in order to
compile a function beyond the definition of the function with defun, which is
all that the interpreter needs in order to interpret the function. This
information can be supplied through declares.
A declare is a list whose first element is the atom declare and whose
remaining elements are forms called "declarations." The compiler processes a
declare by evaluating each of the declarations, at compile time. Usually the
declarations call on one of the declaration functions which the compiler
provides. These are described below. However, it is permissible for a
declaration to be any evaluable form, and it is permissible for a declaration
to read from the input file by using the read function. This may be used to
prevent the compiler from seeing certain portions of the input which are only
needed when a program is run interpretively. Prefixing a form in the input
file with (declare (eval (read))) would cause it to be evaluated at compile
time if the file was compiled or at read-in time if the file was interpreted.
Arbitrarily complex compile-time processing may be achieved by the combination
of declarations and macros.
The remainder of this section describes the declaration functions provided
by the compiler. Note that if a declaration function described below is of the
form (foo t), its effect can be reversed by using the form (foo nil).
(specIal var1 var2 ... )
Declares var1, var2, etc. to be special variables.
¬
(unspecial var1 var2 ... )
Declares var1, var2, etc. to be local variables.
¬
(*expr fcn1 fcn2 ... )
Declares that fcn1, fcn2, etc. are expr- or subr-type functions that will
be called. This declaration is generally supplied by default by the
compiler but in some peculiar circumstances it is required to tell the
compiler what is going on when the same symbol is used as both a function
and a variable. It is good practice to put *expr, *lexpr, and *fexpr
declarations for all the functions defined in a file near the beginning of
that file.
October 2, 1979 ∪4-2. Page 4-11
Maclisp Reference Manual
(*lexpr fcn1 fcn2 ... )
Declares fcn1, fcn2, etc. to be lexpr- or lsubr-type functions that will
be called. This declaration is required for non-builtin functions unless
the functions are defined in the file being compiled and are not
referenced by any functions that are defined before they are.
(*fexpr fcn1 fcn2 ... )
Declares fcn1, fcn2, etc. to be fexpr- or fsubr-type fUnctions that will
be cAlled. This declaration iq required for non-builtin functions unless
the functions are defined in the file being compiled and are not
referencEd by any functions that are defineD before they are.
("*array arr1 arr2 ,.. )
Declares arr⊃, arr2, eTc. to be arrays that will be referred to. See the
note ufder *expr.
α(fixjumvar1 var2 ,.. )
Declares var⊃, var2, etc& th∞AE∀∪mCe%CEYKLAoQ←MJ@Am¬Y`↔↔~β←'MDαε∞L|↔O~,PhR∧∧ααεm∪εw.↑5`hPβ"Jm>≠]-Tλ∧3 #n type1 type2 ... ) ,.. )
Declares fcntk be a fUnction which always petuRns a dixnum result. Also
the types od∧@Ai!JAC⊗;W7↔w#E↓βneβ*↓β∪↔≤cπK↔"βπL''KC∃EbβSgC+⊃1↓β-#
9↓∧84)α↓↓↓β∂∪↔W7.sQ↓β'KC∃βne↓β⊗)↓β≠MC;W5bβ7.≥m⊗v:∧∞FF*∧↔⊗?]\Vw"
↑W∨"∧&*α⊂ε&O
nVj`Q$ααα∧ff}n]Rbε\\⊗vNlpλ∧∞~→(≡Y⎇;,]]λλ
↑<⎇λ,(λ_$[≠{N]+α;n⊂77j≡x2V⊂λ6rpw~w3P:~2FE⊂λ⊂⊂⊂0\3zvr[:⊂6p↑P12P≠s⊂0w≡P:<x→WεEεB⊂⊂⊂⊂λ*42Pλ:;wPλ:<x2\P7s⊂λ34|7≥vP⊂2→qv0y_z4ww≤P6p|H⊂12Pλ4w:2\6t|2Y⊗⊂⊂3≠y⊂2|_vx62CE⊂⊂⊂λ⊂∀34↑7:vP≡⊂∀3_⊂34|≠:vTP≡TWεEβE∀36≠w:vP≥0y_P≥0y→⊂↔↔⊂∀→1w⊂:≡x2XP↔↔⊂∀H↔↔↔⊂
FE⊂⊂λ⊂⊂$yH:42P≤pvrPλ0yP:~2P34↑7:vP→2qv0\0z4w[⊂⊂2|_rx:⊂≥42P;_y4pq≠2yP⊂≠y⊂3:[1z4w[⊗FE⊂λ⊂⊂⊂9→yzv:≤P0y2H22qv_y2r⊂≥7P0v≥p|yP_2P36≠w:vyKεEεE
77z<\2P;0\_P;0\→⊂↔↔⊂∀31[⊂:<x→XP↔↔⊂∀P↔↔⊂∀FB⊂⊂⊂⊂λ$yP:~2P9p[rP⊂0\P:42H34|7≥vP22Xv0y0]4ww⊂λ2|1r\:⊂:4→P;0y~pq62\P⊂7yλ3:w1]4ww⊗CE⊂⊂⊂λ⊂92y]v:9P_y2P2→qv0y→r⊂77]⊂:7P_2P7sλ0w<P≤x2qtY4qP:≡x2WεBεE∀3~|9{P≥∀FE⊂λ⊂⊂⊂!XzyryH⊂:42H1wvx~v2y⊂λ:7P0\yzvrH⊂:40]⊂0v6αpy4z~6rz4XP4yPλ:7P1→P⊂27[2P;t]4εE⊂λ⊂⊂⊂3~|7:v\P2|1[:yt{→v<V⊂→|1rx≥⊂⊂:4_z⊂7q≥4wzy[<P3:[1z4w[9P⊂9]qt⊂0\P∃R∧Xw2⊂1[yFE⊂λ⊂⊂⊂;Zv6⊂9]4v6⊂≥yrP3≠7w:v\WεEεBεE(0YrP~⊗LY∧DDH⊂⊂⊂⊂∧Z⊗Y↔αDDP'Xz7q2\⊂→⊗⊂\[\FB Declarations
(fixsw nil)
Turns off the above.
(flosw t)
Causes the compiler to assume that all arithmetic is to be done with
flonums exclusively, except that obviously functions such as + and rot
will still use fixnums.
(flosw nil)
Turns off the above.
fixsw and flosw are variables so (setq fixsw t) is an equivalent
declaration to (fixsw t).
(setq special t)
Causes all variableq to be special.
(setq nfunvars t)
CauseS the compiler to disallow functional varaables. All symbols in
function position in afkrm are assumed to hav@∀ABAMU]GiS=]CX@↓ae←a∃airA¬h~∧@@@AeU\@Ai%[J\@↓)QJ@↓GCgJ↓←L@A∧Ags[ ←X@A]Q←gJ↓mCYk∀@ASf↓B@AMU]GiS=]CX∪→←eZA%f~∀@@@AI%gCYY=oKH\4∀~∀Q5CGe←LAhR~(@@@@↓πCkg∃fA[C
e↑AI∃MS]SQS←]f↓iVAE∀AeKi¬S]KH↓ChAeU\AiS5J\~∀4∀Q[C
e←fA9SXR~(@@@@↓πCkg∃bA[C
a←f@↓iVAE∀AIKMαK;↔⊃αβ?;3JβπQβ≤{7C'd)↓βSNk∃9↓¬##'MεKE↓β&C∃β∪.3πW3 h)↓↓α↓β∂π≤∧Rph!Q"F>]nπ⊗.m∨αε6⎇u⊂hR∧∧αα∧<≡W≡/4↔/F≥M⊗∂↔∀∧ε7.l:FN}n4ε>∞lZ&∂&\@ε↔J∧
FF*8m↑~;→.∧
→Sn∧λ~;N>_;XlT≥z→-a"Hλ∧∧λ→]-l⎇~;md~<h∞↑y9
$∞≠h_LT≠X;,\λλ→M⎇{Kλ∞⎇→<Y$
H~<d(≠]-\Y<H
≥X|Y-\;]→,Dλ_↑$ε#"H∧∧λλ→,≤zλ≥
≥9(≤n\zλ_$];XnM;{H
≡h→y-l<X=\Hλ
M→(→l]\≤Y,m>λ→\{_<L≡~;{D
<h≥.<9β"D∧λλλ∞⎇→;H∞<=Y<L≥λ≤y.<X=]≡(⊂m⎇<~;\λ→Z-L<h_.,(≥≠dY(≠
|9→9∧∞≠yy.M→<K∧
;H≠n,→<C!$λλλ∧∞≠h_.mz9λ
l;9(=_<r↑kHλλ⊃<Y8.={X8ML(_{mnY;]
≥{H≥m};→λ,(≥≠d∞<y(∧∞~→(
l;9#!$λλλ∧
yHλ∀λ→Z-L(_<d∧≥~→$∧→y;N∞Y9Z/∧≥z=
;Hλ∞M_=λ∧Z;→%dλ∩9D∧≡;⎇$∧→≠{D}λλ→m≡Y(_!QHλλ∧∧→y;N∞Y9Z/∧→→8mL<X=
≥{Kλ∞M→(_m⎇<~;↑H≥<l↑hλ9d
|H≤m⎇9=~
≥Yh≠
≥y(≥
=C!!"C"AQC"C!!"SxnMxY<DεKλ'⊗n""!∀λλλ∧αm,Ea""(∧∧λλλ∧
_9y$ε,,aQ@↓A""(∧∧∪88mM<|λ
,9Y<L]Xy( \;]8-A"C"AQJ_<N,>*H¬∞≤<→$<\L$
L(_..LH≠F$KKD¬(KEd
#"D∧λλλ ≡h≥<l\λ≥≠d→8s≡Y(_..X><d<\L%D_<\F%λ→=5Hλ≥∂≡→(≠,∨(_Y$Z>≠N]+λ→MM{];%D≠|C!$λλλ∧
[⎇≡..h~.D~;Y
≤x=→.4≥z_.D≥≡4T≠yH
|ZY8nNh≥z-Mλ_Y${{]≥;Y9∧
;H≥
(_<N,><kAQHλλ∧∧≠L+∧∧≠LK∧∧→=_edλ_<LTλ≥~Q;];,,<B;ldλ→~-\;\z-⎇\b2-dλ_<Nε+λλ∧<\DEDλ→=5C"H∧∧λλ≤L↑|→8nM=Y;∂∃Hλ∃
(λ→/∞→;Y\λ→[n-"*_..X>*D¬≥≡<Tλ
_..L(→
≥,+L$∧→~;&∃LHEeC"H∧∧λλ→
≥,+[E∀ KKE∃(_p-d_Y(∞↑y9D∧∩=λ
≡h≤≤L\Y<\L\λ~9D∞~→(M;9;N=9{\d<Y(
=[⎇{D=β"D∧λλλ={<~-L+=~-\+Hλ
M→(→
≥9;\m≥{\hL8{_.,9λ≠.↑⎇λ_LT→:=
<H⊃M∨≠];.4≠|H
m;λ∪n∧∂kβ!$λλλ∧∞z~8m∧~;Y
≤x=→$(→~-\;\z-⎇H≠[nDλ~{M}{H_.D_{p⊗\4v2P≥4vrWλ⊂$s⊂λ24vr[9tww≤P0y2CE⊂⊂⊂λ⊂22q[0y2r⊂:42H1wvx~v2y⊂_pw⊂3Yw2y0]2P3 \z2y⊂_wr2WβEαE⊂λ⊂⊂⊂*~2P0y≤0|U⊂→2qv0\0z4w[⊂⊂1p]yryP≥42P1[vx4f→y⊂⊂:≠P3rw→y0z2H4w⊗v~w2P⊂_wr2P→7yεEλ⊂⊂⊂⊂_qqri\rqP'Y⊂0w2λ9z7y→SyP4[:7P⊂≥42P0\90|yH22qv_y2r↔λ⊂*44\P1wr→P⊂4iH9wvr]t0rεB⊂⊂⊂⊂λ30yz→y⊂:4_w⊂:4→P:yzXv⊂9zX97zz~w2VqXv6⊂0\90|P_qqri\ts3Gλ⊂*42H⊂1wf\4v2yλ;tv6βE⊂⊂⊂λ⊂0v9[P3rw→y0z2H4w⊗v~w2P1[r2P4Yα the arbaycalL function is used; in this case
the array must be named by an arBay)poInter pathep than by an atomic
symbol.
¬
(arath (tyPe1 fCn1 fCn2 ...) (type2fcn21 fcn22 ... ) ... )
Is used to declare a general arithmetic function such as plus to be
replaced by a one-type arithmetic function such as +. fcn1, fcn2, etc.
are the funcTions tk be replaced. type1, etc. is the type of function to
replace them with: fixnum means replace them with the corresponding
fixnum-only functions, e.g. replAce plus by +. flonum means replace them
with the corresponding flonum-only functions, e.g. replace plus by +$.
notype means turn off a previous arith declaration for these functions.
The following declarations are useful only in the pdp-10 implementation;
however, the Multics implementation will accept them and ignore those which are
irrelevant.
(mapex t)
In the pdp-10 implementation, causes all map-type functions to be open-
coded as do loops. (This is always done in the Multics implementation.)
The resulting code is somewhat larger than otherwise, but also somewhat
faster.
(mapex nil)
Causes map-type functions to actually be called. This is the default.
Page 4-14 ∪4-2. October 2, 1979
Declarations
(noargs t)
Causes the compiler not to output information as to the number of
arguments each function compiled takes; this provides some saving of
memory space in non-Bibop pdp-10 implementations.
(noargs nil)
Causes the compiler to output number of arguments information. This is
the default.
(messioc chars)
Causes an (ioc chars) to be done just before printing out each error
message. In this way one may direct error messages to the LAP file
instead of to the terminal on the pdp-10.
The default messioc is vr which puts the messages in both places.
(muzzled t)
Prevents the pdp-10 fast-arithmetic compiler from printing out a message
every time closed compilation of arithmetic is forced.
(muzzled nil)
Causes the compiler to print a message when closed-compilation is forced.
This is the default.
(symbols t)
Causes the compiler to output LAP directives so that the LAP assembler
will attempt to pass assembly symbols to DDT for debugging purposes.
(symbols nil)
Does not generate debugging symbols. This is the default.
(closed t)
Causes arithmetic operations to be close-compiled, that is, the function +
will generate in-line code but the function plus will not in any
circumstances. This declaration is necessary if you apply plus to two
fixnums and want A bignum result if the operation overflows.
(closed nil)
Causes the compiler to produce code that assumes overflow wilh not occur,
which may give incoprectlts in the above case. When the compiler can
determine, by declaration or implication, that all of the operands to an
arithmetic function are fixnums (or flonums), it will generate code to use
the hardware fixnum (or flonum) instructions. This is the default state.
October 2, 1979 ∪4-2. Page 4-15
Maclisp Reference Manual
This declaration only exists in the Multics implementation.
(defpl1 ...)
Defines an interfacing function which may be used to call programs written
in other languages, such as PL/I. See part 4.6 for details.
Page 4-16 ∪4-2. October 2, 1979
Running Compiled Functions
3. Running Compiled Functions
After a file od functions has been coMpiled, those functions can be loaded
into an environment @¬]HAi!K\AkMKH\@↓)QKr↓GC\A JAY←¬IKHA∃SiQKHAErAUgSMN↓iQJA1←CH~)←d@A→CgY←¬H@AMU]GiS=]f∪I∃gGeS KH@A KY←n0@A←dAEr@↓kgS]≤@AiQ∀@ACkQ←Y←C⊂AMKCQkeJ~)IKgGISEKH↓←\Aa¬OJ@f4dl\~(~∀~∃QQJ@A→←YY←]S]N∪→k]Gi%←\@@↓Sf@A¬h@AaIKgK]P@@ACYCSYC YJ∪←9Yr@A%\@@AQQJ∪≠UYiSGL~∃S[AYK[K9iCiS=\\~∀4∀~∃Y=CH∩∩@@A'U¬$@b↓CeN~(~∀@@@@QY=CHAp$X∪oQ∃eJApASfA∧AMSY∀@Aga∃GSMS
CiS←8ACGG∃aiCE1J@AEdA←aK9RX@A$]J\A∧~∀@@@A]C5Kgie%]NA←HABA]¬[KYSMhXAG¬kgKf↓iQJAMaKGS→SKHA→SYJAQ↑AEJ↓Y←CI∃H@AS9i↑Ai!J~∀@@@AK9mSe←9[K]h8@A)Q∀∪MSY∀A[CrAEJA∃SiQKHAB@AM←keG∀AMSY∀@A←d↓B@AG=[aSY∃HAMS1J~∀@@@@Q
CYYK⊂AB@E→CgXD↓MSYJ↓S\@AQQJA∪Q&AS[AYK[K9iCiS=\AC]⊂AC\A=EUKGP@AgK≥[K]h↓S\~∀@@@AQQJA≠UYiSGLAS[a1K[K]QCiS←8\RAY=CHAI∃iKe[%]KfA]QSGP↓isaJ↓←LAM%YJASP@ASf↓C]H~(@@@@↓CGif↓CGG←IIS]O1r\∪α↓g←ke
JAMS1JASf↓Y←CI∃HAEr↓←aK]$OS]N↓C]HA%]akg OS]N↓Sh\~(@@@@↓αAeK¬H[Km¬XAY←=`ASfAiQK8AKqK
kiKH↓k]iS0AiQJAK]H↓←LAi!JAMS1J@ASLAeKC
QKH\4∀@@@Aβ\A=EUKGPAMSY∀ASfA1←CIK⊂AErAIKCIS9NASh0AIKM%]S]N↓Mk]GQS←]f↓Cf@A⊃SeKGQKHAEd~∀@@@Aga∃GSMS
CiS←9fAS]MKeiK⊂AS\AQQJAM%YJAEdAiQJ↓G←[a%YKd\4∀~∀~)MCgY=CH∩∩@@A
M+¬$~(~∀@@@AMCMY←CH↓iCWKLAiQJ↓gC[J↓CeOk5K]ifACfAUeKCH8@A∪h↓GCkg∃fABA→SYJ@↓←LAG=[aSY∃H~∀@@@AMU]GiS=]fXA
CYYK⊂AB@E→CgXD↓MSYJ↓S\Ag=[JAS5aYK[∃]iCi%←]fX↓i↑AE∀@AY←¬IKHA%\\~∀@@@A∃qC[a1Jt~∀4∀∩∩∩QMCg1←CHA→←↑AM¬gXAIMVA[C
gsZR4∀~∀~))QJA→←YY←]S]NA→k]Gi%←\A←9YrAKaSgif↓S\Ai!JA≠k1iSGf↓S[aY∃[K]i¬iS←\8~∀~∀4∀~∀~(~∀~∃=Gi←E∃d@dXbrnr$∩∩@@@@&h4f\∩∩$@@@@@A!C≥J@hZDn~∀_∩∩∩@A≠C
YSg`↓%KMKIK]GJ↓≠C]k¬X~∀~(~∃IK→gkEd$∩@@@↓→'+¬H@fAi<@nACIOf~∀4∀@@@AIKMMkEdA%f@Ai!JAMk9GiS←8AkgK⊂@Ai↑↓IKMS9JA]K\@A[C
QS]J↓G←IJAMk]
iS←]L\@A∪P~∀@@@AIK→S]Kf↓mCeS=kfAieaKfA=L@AMU]GiS=]fXA⊃KaK]⊃S]NA=\ASiLACeOU[K]iL\∪)Q∀AoCr4∀@@@Ai↑A⊃KMS]∀ABAgUEdAoISiiK8AS\AA_←∩A%f~∀~(∩∩@@@@QI∃MgkEH@EgK≥]C[Jλ@EK]Qes]C5JDA]¬eOfR4∀~∀@@@Ao!SGPA⊃KMS]∃fAgK≥]C[J⊃K]iee]C[J↓CfAB↓gkEd↓KqaK
iS]N↓]CeOL∪CeOU[K]iL\@A)!J~∀@@@Am¬YkJ@↓eKikI]KH@↓SfABAa←S9iKd@↓oQSG @AGC8AEJ@↓akiaI←`OK⊂∪k]I∃d@Ai!JAgk d~∀@@@AaI←aKeQrA←dAiQJ↓MgkEHAae←AKeir8∪)QJ↓oCrAQ↑@AI∃MS]J↓C\AYMkEd@↓oeSiQK\AS8~∀@@@A!_=∩ASf4∀~∀∩@@@@!IKMgUEd@EMKO]C5JD@E∃]ies9C[JD↓]CeOLdTb`@`W]CIOfb@4dR~∀4∀@@@AoQS
PAIK→S]Kf↓gKO]¬[JIK9ies]¬[JACLAC\A1gkEd↓CYY←]S]NA→e←ZA9CeOfDAi↑A9CeOfH~∀@@@ACe≥k[K]Qf\@AQQJ@b@``@A%fA←GQCX\@↓)QJ@↓mCYk∀AeKiUe]KH↓gQ←k1H@AE∀AakiAe←`O∃H~∀@@@Ak9IKdAQQJAYMkEdAAe←aKIir\~(~∀∪aC[aY∃ft~∀$@@@@!akiaI←`@O5sgkEH@QIK→gkEdE[sMU]fD@ [sgk dD@b$@Ogk dR~∀$@@@@!akiaI←`@O5sMgk d@QI∃MgkEH@E[s→k]fDE[sMMkEdD`R@O→gkEd$~∀∩@@@QaUiae←@@O[s1gkEd4∀∩∩Q⊃KMgk d@E[eMk]fλ@E[s1gkEdλ@d``D@ZdROYgk dR~∀4∀@@@AαAMU]GiS=\@AI∃MS]K⊂AS\@↓iQSf↓oCr@↓eKGK%mKfA%if@A¬eOk[∃]ifA¬]H@AIKike9fASiL~∀@@@AmC1kJA←8AiQJ↓[CeW∃HAaI0XAoQ%GPA[¬rAEJ↓CGGKMgKHAQQe←k≥PAiQ∀AKqi∃e]CX↓giCi%F~∀@@@Aa=S]iKH~∀~∀$∩∩@A1Sga?MiCiS
?mCeM>Igi¬GW?aQd~∀~(@@@@↓'KJ@↓aCehl\l@↓M←dA⊃KiCS1f@A←8AQ←nAi↑A¬GGKgL@AiQ∀ACeOU[K]iLX@AC9H@A←8AiQJ4∀@@@AS]i∃e]CX$AM←e5Ch@@A←L∩↓→∪' $AICi∧\∩@@↓YSga⎇giCi%G?mCIg>I]%X@@@↓C]H~(@@@@↓YSga⎇giCi%G?mCIg>Ii⎇Ci←Z↓CeJA→SqKHAES\ nbRA∃qiKe9CXAgQCiSFl@AiQ∃rAG←9iCS\4∀@@@A]SX↓C]HAP\~∀~(~∀~∀4∀~∀~(~∀~∀4∃!CO∀@hZb`∩∩∩@@@@&PZf\∩$∩A∨GQ←EKddX@bdnr~∀_∩∩∩@@@AIk]]S9NAiQ∀Aπ←[ASYKd4∀~∀~(~∀~∀P\@A%U]]S]≤AiQJ↓π←[a%YKd~(~∀∩∩$AS\AQQJA≠UYiSGLAS[a1K[K]QCiS←8~∀~∀@A)Q∀∪G←[ASYKd↓Sf@A%]m←W∃H@AEdAiQJAYSgA?G←[ASYKd↓G←[[¬]H@AQ↑@A≠UYiSGL\@A)!Sf~∃
←[[C9HAGC8AEJA¬EEeKYSCiK⊂AYG`8@A)Q∀ACeOU[K]iLAi↑AQQJAG=[[C]⊂ACeJAiQJ↓aCiQ9C[J~)←L@AQQJAS9akh@↓MSYJ↓C]H@↓←aiS=]f\@↓)QJ∪
←[aS1KdACAaK]IL@@D]1Sg`D↓i↑@AQQJAO%mK\~)aCiQ9C[JAU]YKgL@ASh↓Sf∪aIKGKI∃HAEr↓iQJ@[aCi!]C[J↓←d@@5a\A←AiS←\8@@A)!JA←kQakh~)←EUK
hAgK≥[K]h↓Sf@A
eKCi∃HAS\↓iQJ@↓o←eW%]NAI%eKGi=erAo%iP@A∧A]C[∀AoQS
P@ASLAiQJ4∃MSeMhAG←5a←]K9hA←L↓iQJA9C[JA=LAiQ∀AS]aUhAMS1J\∪
=dAKq¬[aYJ0AiQJ↓G←[[¬]H~∀4∀∩∩∩%YG`A⊃Sd⎇M=↑]ECH~∀~∃IKCIf↓iQJA→SYJ@ ISd⎇→←↑]E¬d]YSM`DAC9HAae=IkGKLAC\A=EUKGPAgKO5K]hA9C[KHEM←↑λAS\~)iQJA]←eWS9NAISIKGi←Ir\~∀4∀@@AUgkCY1rA]↑↓←aiS=]fA]∃KHAE∀AgkaAYSKH0AgS]
JAiQ∃eJACIJAIK→CkYiL\@@AQQJA←AiS←]L~∃Cm¬SYCE1JACe∀t~∀[ACiQ]¬[J@[A\@[`4∀@@@AπCkMKfAi!J@AM=YY←o%]NACIOk[K9hAi↑%EJAi¬WK\A¬f@Ai!JAKq¬GhAa¬iQ]C5J@A←_AiQJ4∀@@@AS]aUhAMS1JX@A∃mK\A%LAShAEKO%]fAo%iP@A∧A[S]UfAgS≥\\@@D]YSM`DAo%YX@A9←hAE∀~∀@@@ACaAK]IK⊂\~∀~-eval
Causes the following argument to be evaluated by LISP. For example,
lisp←compiler foo -eval "(special x y z)"
-time -times -tm
As each function is compiled, its name and the time taken to compile it
will be typed out.
-total←time -total -tt
At the end of the compilation, metering information will be typed out.
-nowarn -nw
Suppresses the typing of warning messages. Error messages of a severity
greater than "warning" will still be typed.
October 2, 1979 ∪4-4. Page 4-19
Maclisp Reference Manual
-macros -mc
Equivalent to the (macros t) declaration: Causes macro definitions to be
retained at run time.
-all←special
Causes all variables to be made special. Equivalent to the (setq special
t) declaration.
-genprefix -gnp -gp
Takes the following argument as the prefix for names of auxiliary
functions automatically generated by the compiler. Equivalent to the
genprefix declaration.
-check -ck
Causes only the first pass of the compiler to be run. The input file is
checked for errors but no code is generated and no object segment is
produced.
-ioc
If the following argument is x, (ioc x) is evaluated. The main use for
this "-ioc d" which turns on garbage-collection messages during
compilation.
-list -ls
Causes a listing file to be created in the working directory, containing a
copy of the source file and a table of functions defined and referenced.
If the object segment is named "name", the listing file will be named
"name.list".
-long -lg
Causes the listing file to also contain an assembly language listing, with
commentary, of the generated code.
-no←compile -ncp
Causes the compiler not to attempt to compile the file. Instead the input
file is simply treated as being composed entirely of random forms. It is
digested into a form which can be processed quickly by the load function.
in the ITS pdp-10 implementation
The ITS compiler is presently in an anomalous state. There are two
versions, COMPLR and NCOMPLR. NCOMPLR contains the fast-arithmetic facilities
Page 4-20 ∪4-4. October 2, 1979
Running the Compiler
described here. COMPLR is an older version which will soon go away. At that
time, NCOMPLR will be renamed to COIPLR. This documentation uses the name
COMPLR to refer to what is now NCOMPLR, so it is presently inaccurate but will
become accurate in the future.
Invoke the compilep with the :COMPLR command. The compiler will announce
itself, print an underscore or backarrow, and accept a command line, which
should be of the standard form
↓ <output file> ← <input file> (switches)
The file specifications should be stafdard ITS file names, e.g.
DEV:DIRNAM;FNAME1 FNAME2. If it is necessary to get a "funny" character such
as ← into the file name, it may be quoted with a slash.
The compiler normally processes a file of LISP functions and produces a so-
called "LAP file", containing S-expressions denoting pdp-10 machine-language
instructions, suitable for use with LAP (the Lisp Assembly Program). However,
one may direct the compiler instead to produce a binary object file, called a
"FASL FILE", suitable for use with the fasload function or the autoload
feature. A third option is to process a previously generated file of LAP code
to produce a FASL file. This is especially useful in the case where special-
purpose functions have been hand-coded in LAP.
If one specifies only an input file name, say FOO BAR, then by default the
name of a generated LAP file will be FOK LAP, and of a FASL file, FOO FASL.
The various modes of operation of the compiler may be controlled by
specifying various switches, which are single lEtters, inside parentheses at
the end of the command line. A switch may be turned off by preceding the
switch letter with a minus sign. Extraneous or invalid switches are ignored.
Initially all switcheS are off (the use of minus sign described above is
provided in case the compiler is used for several files in succession).
The most commonly)used switch setting is "(FK)", which causes a FASL file to
be produced.
Most of the switches correspond to values of atomic symbols within the
compiler. These are noted in parentheses.
The switches are:
A (as@MK[EY∀R@A)!JAga∃GSMS∃HAS]AkhAM%YJ@A
←]iC%]fA→¬ AG←⊃JAoQ%GPASL@Ai↑↓EJ~∃5CIJA%]i↑A∧AES]¬erA
¬'_AM%YJ\~(~∃∨GQ←EKddX@bdnrα∩$@@@@&hZh8∩∩∩@@@@@↓!COJhZdb4∀_∩∩∩@AC
YSg`↓%KMKIK]GJ↓≠C]k¬X~∧~(~¬λ∪⊃Sg←o8\@@A
CkgKβ→βS#*↓β∂?oβ'3↔∩βS :∧FO≡}⎇bεON0 -LHλ⊂,n→<H
≡λλ~≡h≤⎇≡]→9↓Q\Y3Mm;Y`↔λ⊂*44\β is the sabest wai tk disown a COMPLR, because the compilep will
know that it can't try to get any information from DDT.
F (fasl) Accept a file of LISP functions, produce a LAP file, and then
Assemble the LAP file into a FASL file. This is probably the most useful mode.
With the K switch the LAP file is not actually produced at all; the lap code is
sent directly to faslap as the compiler generates it.
K (nolap) Kill LAP file. Delete the LAP file after assembly. Usually
used in conjunction with the F switch.
Mo(in)(macros) Equivalent to (declare (macros t)). Causes macro definitions
to be defined at run time as well as at compile time.
N (noargs) No args properties. Equivalent to (declare (noargs t)).
Normally the compiler outputs information in the LAP code as to how many
arguments each function requires, so that argperties may be created on the
appropriate atomic symbols at load time. In some implementations these
properties occupy a significant amount of list space; thus it may be desirable
to eliminate these properties.
S (special) Equivalent to (declare (setq special t)). Causes all
variables to be considered special.
T (ttynotes) Causes the compiler to print a note on the user's terminal
as each function is compiled or assembled. This switch is normally off so that
a COMPLR may be proceeded and allowed to run without the TTY. In any case
error messages will be printed out on the terminal.
Uo(in)(unfaslcomments) Useful only in conjunction with the F or A switch.
Causes the assembler to output comment messages into a file whose second file
name is UNFASL. (Actuallq, this file is always created, and error comments
will be directed into this file also if messioc so specifies; but the file is
immediately deleted if it contains nothing significant.) These comment messages
describe the size of each function assembled, and give other random information
also.
V (nfunvarsf1 Equivalent to (declare (nfunvars t)); disallows
functional variables.
W (muzzled) (i.e. Whisper). Equivalent to (declare (muzzled t)).
Prevents the fast-arithmetic compiler from printing out a message when closed
compilation of arithmetic is forced.
X (mapex) Equivalent to (declare (iapex t)). Causes all map-type
functions to be open-coded as do loops. The resulting code is somewhat larger,
but also somewhat faster.
Z (symbols) Equivalent to (declare (symbols t)). Causes the compiler to
output a special directive in the LAP code so that the LAP assembler will
attempt to pass assembly symbols to DDT for debugging purposes. Primarily of
use to machine language hackers.
Page 4-22 ∪4-4. October 2, 1979
Running the Compiler
COMPLR will accept a "Job Command Line" if desired; simply type
:COMPLR <command line><cr>
In this mode COMPLR will automatically proceed itself and run without the TTY,
and kill itself when done.
It may be desirable to execute some LISP functions in the compiler before
actually compiling a file. Typing ctrl/G will cause the compiler to announcE
itself and then type an asterisk; you will then be at lisp's top level. To
make the compiler accept a command line, say (maklap) or type ctrl/↑. One
useful function for debugging and snooping around is cl; (cl foo) will compile
the function foo, which should be defined in the compiler's lisp environment,
and print LAP code onto whatever device(s) are open for output.
October 2, 1979 ∪4-4. Page 4-23
Maclisp Reference Manual
α
¬
¬
Page 4-24 ∪4-4. October 2, 1979
The Lisp Assembly Program, LAP
5. The Lisp Assembly Program, LAP
Maclisp includes a facility by which machine-language programs can be
defined as LISP functions. This can be used to gain direct access to the
hardware or the operating system, and may also be used by the compiler.
The Lisp Assembly Program translates S-expressions which resemble the native
assembly language of the host machine into machine language, and sets things up
so that machine language coding can be called by LISP programs in the same way
that built-in "subrs" are called.
5.1 LAP on the pdp-10
The lisp compiler for the pdp-10 implementation does not output binary
object files directly; rather, it outputs a series of S-expressions denoting
the machine-language instructions of the compiled function. There are two
programs which accept such S-expressions and convert them to binary machine
language, called lap and faslap. (Historical note: the word "lap" dates back
to 7090 LISP, and is derived from the phrase "Lisp Assembly Program".) lap is
an in-core assembler; it reads in the S-expressions (hereafter referred to as
"lap code") and deposits the resulting binary instructions in the binary
program space of the current lisp environment. faslap, on the other hand,
takes a file of lap code and produces a binary file suitable for use with
fasload. faslap is normally part of the pdp-10 lisp compiler, but in some
implementations with limited memory it can be a separate program. Both
assemblers will accept the same lap code, except for certain peculiar
conditions. This section will describe the lap function and lap code;
differences between lap and faslap will be treated in a special section.
5.1.1 The LAP Function
lap is an fsubr which is executed primarily for its side effect - loading in
a binary program. It accepts a series of S-expressions similar in form to a
program written in MIDAS or MACRO-10. It is not intended to be a fancy
assembler: it does not have conditional assembly, macros, or complex literal
generation features. It does, however, contain sufficient power to load the
October 2, 1979 ∪4-5. Page 4-25
Maclisp Reference Manual
output of the compiler, plus enough extra features that simple machine-language
functions may be hand-coded in it. (See the section on conventions for writing
lap code by hand on part 6.6. The major operational differences between lap
and MIDAS or MACRO-10 are that (1) lap is one-pass, while the others take two,
(2) lap uses the function read to input lap code, while the others are more
efficient, and (3) lap assembles directly into the lisp environment, while the
others produce a binary object file (note that faslap differs only in the first
two respects).
The lap function is an fsubr which expects to get two atomic symbols as
arguments; the first is the name of the function to be assembled, and the
secOnd is the type (i.e. the property under which it is to be stored on the
property list.) Thus
(lap quux subr)
would assemble a subr called quux. When invoked, lap repeatedly calls the read
function, operating on the S-expressions thus obtained, until a nil is
encountered, at which time the assembly ends. SoMe messages may be printed out
as this happens. If the assembly completedsuccessfully, the variable bp@=eNASL~∃ka⊃CiKH↓iVAe∃MP∪↔≥!↓βSF)β;↔:βG'k*β?→↓ε∪';π↔IβCK};Kπ∃¬≠Cπ∂*aβπ≠ KS#∃εCCK␈βK'π&(4+C⊗{C↔K'Iβ'Mπβ3π∂.!β?9π##∃βπ∪?C↔↔#eβ3O≠Qβ?2βS#∃¬≠C↔∂N3'↔⊃∧S?7N→βOGn∪?18hP4 ↓αα3/Kn33@∃Dεf∂∧F}/4
f␈"∞,W≡↓9→(
≥H≥~T~;Z.M8;λ
M<|λ∞∨<⎇→-Uα⊂:4≠zst≤42P4[4z4p[∧A1l\z2v@ dkes contain several speCiadize` f@U]GiS=]fAM=` βW≤)βe∧¬F∂αβHλ ≥\⎇→,≤α∩⊂ ,ap
Has an autolh∂CHAae←AKeiR↓←D@Q1C`AM¬gX∪G=RRA↑αqα&R~βπ;⊃α↓##εαββπObβOgMJ↓β?9¬##∀∀T"⊗
T∩απ∨≤∧u]+B5
∞<kλ
≤H≠`↔→P9t`-plq@IKCIfASLA∧AMSY∀AP∨→∧cπAβ_¬v&*
@λ.∧λ≥z-Lα⊂6 /a`λ~∃¬ki←[¬iSGC1YbAβ9HACFπ≠↔7d)βS#*β↔∞l8
≥y\kAQ@εE⊂λ⊂ 2@2e ic an e@aC[aYα)↓β?2βG?7*β#π↓∧∧6}εT∧π>F≤9αε≡|.&/∨
yf'~∞-w.z≠⊗$∞≠hλ∞M→(≠
≡|β"LNαs1j~ww⊂6Yvx]εBE∧Pλ∀" Hλ#*g'⊗VfbfTP!ba∀∀FE∧λ⊂∀ i⊃iP#*S',VfQdhP∀∪$f⊂↔λ→∀TFB⊂⊂⊂⊂λ⊂&bfP cP⊂
%*fh⊃P!⊂&Qdbg"
DP∃y→yzv*λ70v⊂~s⊂0y→P→⊂'~vεE∧↓ (@LRX T 0 B) ;`YG∀AY←←,AChA
CdA←_ACeNd~∀∩@@@@Qπβ∪8A(@`↓αR~∀$@@@@@@Q∃I'(@`↓≠≠9λR%β[←'9εK⊃βO∞k∃βπ~βπK≥βλ4(%α↓↓↓↓αB"JJRα ↓A∧⊃$%↓↑+3O∃π#π/∃ε≠∪Iβ|∧bε∂,tβ⊂h!∀ααα∧∧αDU*:Bβα XTl∀Xu⊂Jβ4⊗v"∞N'Jε≤|⊗NpQ$ααα∧∧∧l,XYd"α¬ T⎇4Y∀∧
β∧λ"HJπ>&/'↑-bε∂,tβ⊂h!∀ααα∧∧αE∧z "¬α⊃⊃∩β↑←
↔"εn-vjεn]f∨&≥⎇`hP∀∧∧tLAQ hU≤v*βEV#0H⊃∀αα↓6ES*s∃f⊂HH∀ v∨&|,W∩β%DβKw⊃PP`H⊃~FF* M↔∨αλ≡7≡.\-GJ¬∞-v?⊗≥UB∧d~↓PPh!Q"αα mw&*∞Mε∂"∞MεO~
≡2ε?,\↔&g∀FN6l↑&.wA≥⊗rπ>O⊗f*n&}jεvβKα
L↔αb∞⎇εN≡∧∧π&}⎇4π&FQQ&.wM≡&*π∞-v?⊗≥Tε∂~
⎇f*ε≡,w.n]nBbε≥lBε
∞?⊗n⊗⎇Dπ&∞-LRε∂4∞FF*
}FF/%dαα¬MRε',≡v⊗∞=1PW>≡Mαπ&Tβ;β⊗∧εn/M
v"α
≡2π&≡Bπ&Tε.wM≡&*π∞-v?⊗≥Tαεo↑>Bε⊗T∞&.∞D
⊗rε,\f␈⊗T∧εO"
≡0hV≡>6.n-LV#Z∞MεO~<⊗rπ,↑↔.O,Tαππ-⎇εN⊗≡M↔6.O∀εf∂,|Rε∞]}Vw'4
v2α
\Vn␈/∃Bε/>V≡N≥MGHh,mw∩πMRεf≡∧ε␈/N∞W"εn-vjε=⎇WεNL≡FN}d
v"ε∀
F∂⊗|TεfO>∧ε7.l>FN}edα¬&Tαεn↑Mε}"∞↑6. Q,'JπNαk∧
F∂α
≡2εo\=αεn},Rπ⊗\≡6}v≤-F*ε≥dππ⊗≤>FN≡≥Dπ≡ON\↔&N⎇n2αFUlrrα∞,V∞&≥lrεNaQ&f∂∧6}&Tg⊗}T∩ε6≥LRJpQ!PRα∧
F∂αMv/~
mw"π↑<Rε∞d∩nf≡>Bε6}$εO'4∞7Nn-⎇Bπ&≤-F*b]↔&F↑%bα¬,≡FF/%Dαπ&Tπ6∞N\PhV|dπ&FQ≡7Nn-⎇BεO4∞7&␈,\Bαε⎇dπ&FT∧ππ⊗}W↔'∀
FO∨D∞Vv&↑$απ&Tπ∨NQ≡π⊗␈↑''Jd∧¬&G↑1PRFL\gπ⊗}∧πW&↑<6BβF4απ∨≥U∩π>}]F"ε\≥6*α∞Mε*π?≥V⊗}D∂'&/<=N↑m}vrπMtεf∂¬Dαπ>≡Mαπ&QPW6≥NV*βF5bαεL≡αεF≡4ε
α
nVn⊗↑$ε}2∞?⊗n⊗⎇N2εNm≡FN∞MO∩ε&\m⊗v.EDεNv=NV&Nltαπ&Tεv∞\↑0hV|dε∞fD∞FF*≤6∨.↑]F∂&}.2bε≥lBπ&Tε∞&N,W∨≡↑4ε}2∞=vn*∞↑6.7]Dπ⊗␈↑M⊗v/4∧εNwL↑&v∞D∞Fxh-M↔∨αa→↔"ε≥N6zα∞↑6/~∞Mε*αnVv∨M≥vrε|↑FnNL≡6␈≥⎇bε
∧∞7Nn-⎇BεNd∧π&FT∧π∨N\-vbε≡1PV␈MW↔>≡<Rαπ]lF.6≥lV"α∞Mrε&↑LW⊗n≥lRαπ⎇W&F↑$αεOD
↔~α∀απεN¬Sα∧
⊗w∨N.V∨&≥⎇bαGMPhV|↑FnNL≡6␈αnVv∨M≥vrα=vw&≥≥g~ε∀∧ε≡}l=↔≡*∞L⊗⊗fT
v2α≥FbπNαk∧∧εNw>N'.∨M≥vw~≥f h-]w∨"
]vvOM}"ε≡≥MG~b∧↔~π|]Fbε≡4αεv≥\W~ε|d¬-,t}2απ↑<V"ε≥nF/⊗l≥FgJ/∩αεM≡7αJd∧∧NpQ.FFO4∞v∂J
L↔αε<≥bπ⊗\=v>v∨,Rε∞MDπ∨&≥lF∂⊗D
⊗w∨N.V∨&≥⎇bεnl]V}v≤>2απ⎇≡FF␈↑Dε&.m≥fNvqQ##β∧
w∩ε]}&*π?≥Rππ-}ε/↔M≤W~r∧ ⊗2α
M↔∨α}4π∨N\-vbπL≤&f*
↔~ε,\VrεM|⊗&.D∧εNwMt∧$%EAPW&]bεf≡∧π>NMDε∂≡4∧∧$%D⊗⊗␈↑Dπ&FT∞f∞g\↑2ε}d∧π∨N\-vg~≡2ε
L↔∨"∞,W≡␈.E`LNd∞FFO1Q&n∞mlW∩ε≥f"n=|F."
L↔αε=|F*ε\∨∩π⊗\lW∩πMtε∞w∀
F}≡≡M⊗}r
≥g&/-l⊗bπMtεfO>∧ααG⎇≡FBε≥aPV∂∞∞&␈π-≤↔&*≥V␈.nDε}2<↔/&≥⎇bbε|dε≡␈↑.6*JaQ hR∧∧¬>F]dεf∂∧∧π&/-]⊗v∂L↑2bε≡Dπ⊗/N↑&w~∧↔~ε≡N2π6≥NV*α∀εfO>Dε}2∧∞FF*
lW:α∞l⊗g.T
v0h,.ε␈⊗t⊗v"∞Mε*ε]nG↔J∞
vNwE∞2Jε|dπ&FTg.v>M⊗}rLV6Nl\BαF≥f"n=|F."∧g.v>M⊗}w4
V∂HQ-ε∂6T
V␈⊗T∧π&F≥dε}vTVw'/∀απε⎇≥g"Jd∧∧N2≥gJα∞?⊗n⊗⎇N2π>↑,Rπ.lLV6Nl\Bαε}$εo.NM↔εg⊃Q&&.m≥f."D∞FF/∀∞vNfD&*α∞∞&NwL\Bε␈↑Dε6O.>Brα ≡BεO4∧ε>.l↑&∞fO∀ε
ε⎇⎇v"ε≤LV
α∞Mrεf↑APVf≡∧π&/-]⊗v∂LTαεv≡NW⊗∞MO∩bπ,≡FF/$∞FF∞d∧π∂.≡NFNvt
w/"
|`NOEDπ≡Nl<RεOD∧εF∞=>2π&QPVf≡>αε.nm↔⊗}m\Vw"
≥bπ6≡-⊗␈/4∞ε.∨]M⊗∂∩∞|↔O~aQ hPQ&Rs
f$α¬6≥M⊗"∧H~α∧≡|LR∧6}-W_h!Q hR∧∧εf∂∧⊗∨'4
vrπMR¬~\←ππ⊗↑>6N}n4εO"∞,V∞'4↔~εm⎇Ff␈}7 hPQ-fN`Q$ααα∧
F/⊗]≥f∂&T↔∨≡]\&gJ≥f"π,↑G/⊗edα∧∞o∀εfOL↑&∞g4v.v↑,↔&.D↔⊗*∧↔∨≡]\&f.D
⊗w&qQ"αα∧∧εn.]}'Jα≡BαπMRε.lDαε}d∧π&FTg.v>M⊗}rD∧π&.↑
w⊗∂/⊃↔∨N\-v`NL\fNv≡M⊗}w4↔⊗(Q$ααα∧fg/=V"b≥f"α¬v∨'|∀π"J∧
↔~ε↑l⊗g.≡LV"r∧
FF*∧
fNb∞=ε␈.LDαε⊗Tf}fM}v."∧'Jε⊃Q"αα∧∧π∨ε≤<Rbα,V≡∂↑<Rαε<≡'⊗N≤|Rπ⊗↑NW⊗r∧
↔~α
mw"ε≥Nv∂O4∧ε∞r∧↔&}T∧π≡/≡&∂&}%bα∧≥aPRα∧∧απε≡.FN∨]L↔∩b∞Mε*ε=⎇WεNL↑"ε&↑Vv'4
vrπMW⊗*,VNvt∩π∨≤6*πMW⊗*aQ hPQ)v∨&|,W∩β%DβKw⊃⊂HJ∧∧↓≠"VUc
s⊃⊃⊂Jα∧∧ααα
⊗>*εES∪8Q `H⊃∀αα∧\≤6fO>∧¬⊗.l↑&.v<T∧n∞n\⊗`h!Q hV≡MvnN4∞7Nn-⎇@hPQ$ααα∧λ↔∨≡≤⎇bπ&t∞FF*≡F}n≤4π∨N\-vbα
mvrnm≥Bbε|dε≡␈↑.6*J∀π&.↑
w⊗∂/∀απ∨≥Tππ⊗}W↔'⊃Q"αα∧∧ε/∂\≥Bπ&t∞FF*≤F'⊗↑>2ε}d∞FF*
lWG"∞⎇w⊗"∞Mrε⊗T↔∨≡]\&f.D
⊗w&udα¬&∞↑2ε}lTπ/≡↑1PRα∧∧αε∂M⎇VN~∞?⊗n⊗⎇N2αε≡4εf}<≡FN}d∞F∞?5a∩∧Nd¬π∨N\-vg~∞E∩αε≡4εNrXf6.>Dαεf≡∧π>NMAPRα∧∧απεo DDT if lisp's symbol table has been
loaded.
(defsym atom1 value1 ... atomn valuen)
For each i define atomi with a sym property of (eval valuei). No binary
words are generated, And these symbols are not pas@MKHAi<A (8@@A≥=iJAi!Ch~∀@@@AQQSfAAKeM←I[fAB↓YSg`↓KmCYUCiS←8XA]←PABAY¬`AKm¬YkCi%←\B~(~∀
∀!K]iedA]C[∀Aica∀R@A←H@@QK9ierA9C[JR4∀~∀@@@A ∃MS]Kβ→βS#*βπS?nK
βONk?0Nsπ7∃π#=β*β¬↓β5+;∂SN{9β?2βSgC*βSgC*↓β←'&Aβ↔;'∪d4)α↓↓↓βε{';QεQβSF)β∂W↔∪↔;Q∧c?∂π&K?99α↓α'→π#gC∃εKMβ;␈!βOC.≠'≠'.!1β'"↓β∪↔4W3S~βS<4R↓↓↓↓π##∃β≡+∂?;"βπK∨.k↔;Q¬#=β3∂↓1β%v)9↓β&C∃βSOβ∃β?2βS#∃πβK';≡KCπ1ε+;SKHKS=β&C'L4R↓↓↓↓ε3W;∂&K?98Ls=βNsπKeαβ←?K'→βπK*β∨↔;/∪πS↔"q↓αSFKM↓β6{K5βO→β;?"βWO↔"↓βeπ##∀4R↓↓↓↓ε{WSC/!β?→π##∃βfKOAβ≡{7C'f+I1β∞s⊃β'~βCK?6K∪↔⊃ε{;3eεMβπrβπ'⊃π#=↓β?∪'S↔↔→β?_hQ↓↓↓αβ#π;"k∂?∪.!β3πα↓β∂?&)9↓αO 'π3f{←Mβ≡+[↔K∞aβ≠Wv≠S'?w→↓βSzβO#π⊗)↓βONk?3~βπ;⊂hQ↓↓↓αβOS?⊗∨∃β∂∪↔πMph(4(hQ#πK?→βπS}iβπK?→7CK␈↓$4(hQ↓↓↓αα'→β&C∃βπ∨≠↔7gIβS↔⊗k';π&+M↓β∨+∂∂↔∨≠≠W3gI1βSF+9βπ&{5β∨/#Mβπ⊗;M7C⊗{A↓β∂→β'S_h)↓↓α↓βπK?→↓βC⊗{C↔K'I9↓↓εS?5αβ7WO"↓β∃ε9↓β.sSKeαβC?'w '?→αβS#∃αβ≠W;∨#'?9ε∪↔';8h)↓↓α↓βπO≡+73.!9↓αvyβ'vKeβ>{K∪MεK∃β>+;↔K∂#↔⊃9ααS#∃πβ∪A5↓β3'∨↓↓β∂}kC'3/⊃β←'f`4)↓α↓↓β?/#CWQπ##'Mε#↔∂3∂∪πS'}qβ'9ε+π∂!ε3W;∂&K?9β≡{7C'f+⊃βWvc↔OMα↓#∪↔≡cπK∃αC;?π⊗;L4)α↓↓↓β"I%β?∩βS#∃∧qβO←O#∂!βO→β∨'6+99↓ε3πO3∂↓βK↔∂+'K↔~βS#π"β↔π∂B↓βπK?→β∪↔≡cπKπ&K?84R↓↓↓↓ε3?33␈9βS#*β∂?K⊗+OC?v#';≥ε+;SKJβC?'w!84(hP4)#≡{77↔w!↓99rH4(4R↓↓↓↓¬##'Mε3?K5εKMβS␈#π33Jβ'∨;␈∪↔⊃9αα?→β≡{WKO*aβO'v≠∃βSF)β3'∨↓βK↔∞#↔IβO→βWO.!βS<hQ↓↓↓αβ';C/!β3παβ∂?∪*aβO↔nK∂?3}qβ∂?nk↔;S~β7πeε∪∃βW≡+⊃βπ~β←↔3bp4(4Ph(4*ε∨∃↓"iI`$HI↓↓≠!5U9
qH$$Jα?∂S}∪↔I↓∩a↓Ee;H4(0$$M##∃αfKOAα∂≠O↔7⊗ceαC⊗{∨Kπjaα2εh(4(hQ#↔[∞aβ≠?⊗iE↓9rqβ≠?⊗k9$4Ph)↓↓α↓απCεc'↔MαβS#∃ε3W;∂&K?9↓ε+[π1π#=↓β.∂!β6{K4'NqβSW⊗q9↓↓∧s=βNsπKeαβ←?K'→βπK(h)↓↓α↓β∨↔v+KπS.!9↓α&C'MβO→βWO.3W1β6{I↓β∨+∂!β&C';∨~βπM↓F+[π1αCO↔S
β'π≡)↓↓I~q%%β␈⊂4)↓α↓↓β←FS↔[/⊃84(hP4)#∨K7?g→βQ7␈⊃7;'bH4(4R↓↓↓↓∧≠?;S⊗{3Mβ&C∃β3∂↓↓β≠.SWK*β←#'≡AβSKN+MβSz↓βCπ∨→βOgn∪?3'~β3?∂∂#'?9αβ;π7/→βS<hQ↓↓↓αα∩∩Qr↓α≠W↔##↔Kn{K∃1εK→βSF)βOgn∪?3MπβO↔W&y7?C/∪πS'}qβ?∂∨+KL'∞sg←#/∪∃β←O##'8hQ↓↓↓αβ¬β∨O3↔9βfAβ≠.s∂S'}q1βSF)β;πn+Mβπv!β3?≡S'?w→β?→π##∃β.sSKeπβ?';'_'?→π##πPhQ↓↓↓αβ≠W;∨#'?9π;'31ε3O=ε∪∃βC∂≠O↔⊃π#=α∩%!9↓αvyβ'vKeβ>{K∪MεK∃β>+;↔K∂#↔⊃9αα;?S(h)↓↓α↓βS#∂!βS#/∪∃β'~↓βC?∨≠''fKSeβ6{Iβ∂}s≠WON{9β#/∪∃↓β⊗+∂πW≡)β3παβ←'3b↓βπ∂≡+CQβ∂_4)↓α↓↓βS∞;Mβπ&{7'
π≠g7}cMβ←O#!β;∞k↔Mβ}1βπ;Jβ3↔;?#!1β>C'3∃∧j&∩ε~βπ;⊃∧"∩Qβ'∪W;∂∂#∀4)α↓↓↓β&∨M↓π#=↓β≡Kaβ∂FKπ∂&+KM8JαS#W~↓βGW/CπIε;⊃↓πWWc⊗i↓β∂∪∃↓β';=β∪N3≠↔K.sP4)α↓↓↓β∨K7?g→βS=αβ3πAbβWQπ;'30NK;S↔⊗3↔K∃π;'S!ε+π∂!αβ?S#/⊃β←#.qβCπ∨≠↔⊂'&yα∩∩"p4)↓α↓↓α←F+9βONk?3~βπK∃πβπOO.!βS=∧"∩Q1π##∃βv7↔MεK∃β'∪W;∂∂#↔⊃β&yβO'Bβ∂#π⊗∂S↔↔→04)α↓↓↓β∞s⊃βπwIβ;?rkOGW␈S∃β∂FKπ∂&+I↓#
β∂#π⊗∂S↔∩β?S#/⊃βS#∞qα¬6Ra↓A5Ja↓91α!1β?∩↓∃$4R↓↓↓↓εKMβπ∨≠W7↔"βS=↓ε∪∃β¬ε#?Q8M≠';∂*β∪?S~β7WO"β∃↓π≠3πOFK≠'↔"βS=β⊗)↓βK.⊃β'w#<4)α↓↓↓βfKOA1π##∀'∨#π;∪∂∪⊃β∂}s[↔;&K?9βO_'S=π+O∃↓R↓↓#SF)β3'∨↓β∂?oβ'3↔∩↓βWO/→βS#O_4)↓α↓↓β∂}s[↔;&K?9%r↓↓αSG+Mβ?v)↓β←␈+3⊃↓π;K'S*↓"*Nα↓α⊃↓αR2∞εda%β'w≠S↔π"↓β?→α↓"*Nαα⊂4)α↓↓↓↓zr2∞εda%84Ph(4)F#∪SONkMβπ&{5Eβ∂#?5Iαq99β∂#?79Hh(4)α↓↓↓α␈∪∪';∂∪'3eεcπAβ∂≠/MβQβ≠␈⊃βS#*β[π3.+Mβ?2βπ;eπ≠g7}cMβ←FK∂!β∂∪∃βWv#↔≠'v+⊃84R↓↓↓↓∧K→βSFKM↓β&+∂3π⊗S'?rβπCC.KM1αβ3πAπ;'31αβ∨↔Qπ##∃↓π3π3W/→β?→αβπS?k βS#⊗{W∨ hQ↓↓↓αβπS?nqβ≠K}i↓β∪'!1βπv!↓βπwIβ?SF+I↓β.s∪↔≠Ns↔⊃β∨K7?g→↓β←Nc1β*↓β∂?w≠'∪↔⊗+⊃βπ_h)↓↓α↓β↔K⊗{KM8hP4(4RC3?≡Yβ≠'FsW5$hP4)↓α↓↓απ∨≠↔7f+Mβ¬ε∪3?∂Zβ≠'cw+5β←␈∪∪Mβf{;≥1ε≠?;S∞K;';:βk↔K␈→84(hP4)#∂≠∂'%¬→7↔cπ∪↔OON{9$4Ph)↓↓α↓β↔cεc?∪↔~;M↓β&C∃αMn+cCK/≠O'?r↓βπ;"βπOO.k3↔~↓βS#*β∂#π⊗∂S↔↔→↓β?↔#π';.!β';&x4)↓α↓↓βO.≠∂↔O≡K[∃β>{K∪Mbβ≠'[*βC↔Iπ;?K⊃bβ'9α
~∞&%ε≠?∪∃ph(4(hR?∂S}∪↔I↓∩a↓Ee;H$$%α↓MQk)9E9⊂H$%↓α↓↓↓↓¬βπ∨∃β!5IdhP0$$J↓↓α7∞≠3'OααK↔≠/∪↔;∂*α7π;.04(hP4)#≡Kc'"αM7↔GβK↔O≡K?9$hP4)↓α↓↓αONk'3π∩βS=β∂≠∂'%bβWQε≠#πK∞≠S↔K~βπK∃εOO↔n∪3↔⊃π≠'aβε+Aβ←␈∪⊃β'rβO'c⊗KQβ∂}#∀4)α↓↓↓↓FO∂'Jβ∂#π⊗∂S↔↔→β↔';↔↔9β!Aβπv!↓EM:βπK∃π∪↔CK/≠↔;S.!βπMβ↓βS=β9]%8hP4(4RCOGW␈S∃βπ&{5%β␈⊃↓#O∂+?k∃ε3'c;.iβπS}i$4(hQ↓↓↓ααCK?'+∂↔Mε β←?⊗!β?→π≠GW?V('∂?&)1β←FK∂!βO→β¬βf+≠Q7W+OS'6K↔⊃↓π∪π∪'BiUAβ≡{∪∃0hQ↓↓↓αβ≠K?jβS#∃ε3'KO"↓βO'Bβ∂#π⊗∂S↔↔→β?_O##∃βπ∪';Qεsπ7∀N{→βπ&{59↓∧K→↓β6Kc;Whβ'L4R↓↓↓↓πβK↔O.sQ1β&C↔9βM!β'Mαβ∪'[L#↔⊃β↔I↓Qβ∞s⊃βSF('3?:β≠?W∩β'S~β?→↓π##∃β∂+?WSN+;P4R↓↓↓↓εK∃↓ε∪∪↔ ↓β';&y↓βSF)↓β#N;!↓β6{WIβ⊗KSM↓ε{⊃↓β&C∃↓β∨W?k*↓β[πg+∃↓↓G##∃αlJ∩εLhQ↓↓↓αβ∂?;6+;S'}q%)↓ααS#∃αβOGW⎇S∃↓β>{K⊃↓ε;↔;↔⊗S↔⊃εK@~α
≥bα∧~J2αεmz&n∂EDαπ>
_6Bε≤1PRα∧∧αε&≤lf/⊗]nBε7-⎇R∧$X4ε6←-\↔"pQ!PPH%&.>≥dπ&.↑¬W∨N↑5VfO>Dε6←-U⊂hPQ$ααα∧
FF*iw⊗j
~2ε/l≥G.∂L\BαF≡4ε
εM≡7αεmz&jB
mw"ε∀
F∂α[ππ⊗↑>6N}e∃bαα
Mε*π,↑7.gAQ"αα∧∧π≡ε}]F"ε,Tε
εM≡7"ε|dπ6∞M≤B∧d~∧ε≡}LTε6|[<eD≥z~,=λ≥z-Mλ_Y$<|q-\[→9∧
{Y(≡λ_#!$λλλ∧∞~;9%dλ∃~←(λ≠,∨(≥<lTλ≤}-\[{≤d∞z~8m∧_<_→py⊂⊂~w⊂:4→P⊂:2[x⊗y|[yRv$\z↔⊂⊂∃42yrCE⊂⊂⊂λ⊂9|vX7v9P≥tr6⊂λ40{"H0P⊂6≠qpv⊂≤qwx2H1ww3~w2r⊂λ:7P:~2P⊂1→stw⊗λ4W2Wλ⊂:42Zy⊂9|[FE⊂⊂λ⊂⊂89≠x2y:~ryP;Zv6⊂1→P⊂9p]2r⊂0[2⊂92\z7y2Y↔⊂⊂⊂∃44yP≤97{4Y2yP0Bx94vZz4{2H6pqy≠FE⊂⊂λ⊂⊂0w→⊂1wg→4z4w[0v⊂0\yrvq≠<P3 Xtv4z≡WεEεBεE0w≡P7z4→y⊂64\zεEεB⊂⊂⊂⊂λ yyr[q62yH0P⊂9Zw3v2H;wy2⊂;t4Xt⊂⊂4\β asSumed tk be an instruction of some
kind. Fipst, if the list coNta`∪]LAiQJ↓Ci←[%FAgs5E←XAXASh↓SfAI∃YKiK⊂AMe←4~∀@@@AiQ∀@AYSMhAC]⊂@AgCYKH\@↓)QK\AiQJAMSeMhAM←Ud@AG=[a←]∃]ifA=H ↓β&C∃↓βfKGQβ∂∪∀4)α↓↓↓βπ∪?∂↔∨≠↔⊃βNqβ?K&+I9↓¬##↔O*β7WO"βπ31ε∪∃β3∂↓↓ONc3πf+E ↓αC∪↔O≥∪'↔"β↔3␈9%8∀R↓↓↓↓∧K→βSF)β3↔v;S!β}1βS#*β3'O"β'Mβd+GMβ&C↔9β4¬w/∩D
VO∨=→f:ε]HVn∞nN2αε≡,Rε∂>>Vn.AQ"αα∧∧π&z∧&*π,↑&zr∧∧∧NH≥~Tλ≠→-l⎇~λ
|Hλ≥
(≠⊂∀\βt ipεA[←IJ@Ai!C\AM=kdX@↓iQJA∃qaeB4∀@@@AKYK5K]if↓CeJA%K]←e∃H\@AQQJALα{WIβ.c↔7↔w#Eβ?2βS#∃εc'OQ∧K∃β∂≠OW7.!βS=ε∪∃1βLp4)↓α↓↓β?⊗#↔I1¬##∃↓ε{C↔K∂#'?9ε≠?∪∃b↓βπ∂∨+7W3∂#?I1ε∪∪K/≠M1β∞s⊃↓βNs∪↔aε3'↔3'→↓β?2β∧4)α↓↓↓βε#A5Eαβ';O'∪W∂SN{99↓¬##↔O*βπK∃ε+[π3.S↔⊃ε∪eβSF)β3παβOg3f3∃αβ↔[πg+πS?∩βS<4R↓↓↓↓ε{SπNqβ≠?/⊃β;Wn∪↔KMbβ←#'≡AβπK*βS#↔rβπ∪∪.!βS?>+S#↔∩βπ≠S/⊃β↔Ns≥β7}#'≠'.!βπLhQ↓↓↓αβ≠?3f{←MhhP4(4Ph(4(hRCπ∨*↓Q5MH$%↓αMQ5*qE9HHH%α?∨#?↔∩↓I1↓I]d4P The Lisp Assembly Program, LAP
opcode no change
accumulator shift left 23. places
address clear left half
index swap halves
Finally, if the atom @ had been present, the octal number 20000000 is
logically or'ed into the result, thus turning on the indirection bit.
Note that neither the accumulator nor the index field is truncated to four
bits. This has many useful applications; see, for example, the
description of the specbind routine below.
There is a fairly strong similarity between code written in lap and
equivalent code written in MIDAS or MACRO-10. The essential difference is that
lap processes assembly fields in order from left to right in order to determine
which field is which. One pitfall to avoid is writing such instructions as
(JRST FOO) or (SETZM FOO) when one intends rather (JRST 0 FOO) or (SETZM 0
FOO). Another difference to remember is that lap uses the lisp reader to input
lap code; thus one must remember to put spaces around an @, and that one cannot
write (JRST 0 FOO+3) unless FOO+3 really is a tag! (For arithmetic operations
within assembly fields, see the description of lap syllables below.) If it is
desired to make lap code look more like the standard assembly languages, one
may use the fact that comma is like a space to lisp, and that extra parentheses
don't hurt, and write (MOVE A,TABLE(D)) instead of (MOVE A TABLE D). Be sure
to remember that the index field is in the left half because it is the fourth
component, not because it is in parentheses.
5.1.3 LAP Syllables
Each of the four components of assembly words are evaluated by the lap
evaluator to produce numeric quantities; these are then combined to form an
assembly word. Note that @ is treated specially and is not a component. Forms
to be evaluated by the lap evaluator are called lap syllables. Valid forms for
lap syllables are as follows:
a number
Fixnums evaluate to themselves, and may be operated upon by lap
arithmetic operations. Flonums also evaluate to themselves, but
October 2, 1979 ∪4-5.1.2 Page 4-31
Maclisp Reference Manual
α
arithmetic operations on them will not work. Flknums should Not be used
in the address field, becauSe the left halves wilh be truNcated off; they
should be used only in the opcode oR index fields (the latter is useful
for writing (FADRI 7 0 3.0) or something like that).
nil
same as (quote nil).
*
Evaluates to the address of the word into which the current instruction
will be assembled. Equivalent to . in MIDAS and MACRO(
b`@QQ←]KmKd0AgKJ4∀@@@AiQJ↓]←iJ↓EKY←\ACE←UhAYSQKeCYLR\~∀4∀~∃C8ACi←5SFAge[E←X4∀~∀∪¬]rACQ←[SF↓gs[E=X@A←QQKdAQQC\AX@TXAC]H↓]SXA∃mCYk¬iKfAQ↑@ASQfACgMK[EYd~∀@@@Ags5E←XAYCYkJ8@A)Q¬hASf0ASLAQQJ@AMs[E←0AQCf↓BAgs4Aae←AKeir0AiQK8ASh@↓SfAi!J~∀@@@Am¬YkJA=@ βSFQ↓βπ∪?C↔↔#emβ⎇##↔K>KO¬1π##∃↓π3π3W*βK↔S-∪;↔⊃ε∪e↓β&C∃β∨/#7'∪∂≠?@4R↓↓↓↓ε3W;∂&K?9βN1↓β;}q7;'cYβ?SF+K←'≡)1βSF)↓β[∞cW¬β>C'∂!∧"∩Q↓εOO'>sMβSxK'Q9ααπ84R↓↓↓↓ε+CK?∩β?∂∂/∪Eβ'2β;=β63W∃ε≠π9β⊗)β≠?,s⊃β≠⎇⊃β¬β∨K7?bp4(∀Ph)#G.{S∃α~k↔cC⊗+OO'}q$4(hP&CK␈#↔∂S~↓αM7-CCK↔∨≠'?9ε3C?5αβ∨πK⊗∨∃β≤{3#↔≥#'?9b↓βπ;"β↔[πg+πS↔~↓βS=π##∀4R↓↓↓↓ε∪∪K/≠Mβ?2βS#∃ααM7↔GβK↔O≡K?99ααS#W~↓"6>4*%α¬α↓≥"¬∧⊃%%βπ+SMβ&C∃↓β∞#∪K↔∨→β?_hQ↓↓↓αβS#∃¬→7↔cπ∪↔OOL{9↓"
α↓%↓εK;S=ε∂∂Wo+3πS␈⊃α¬9αα←πKvK;≥iε3πO3∂↓↓βC/∪7'S~βS#'_h)↓↓α↓βOgfcπ3*β?;3Jβ'9β&C∃βπK↔O~β≠'↔f!84(hP4)#7+;∂SN{9αMn+cCK/≠O'?rH4(4PJOπ7*βπM↓αCGW?&)IαMn+cCK/≠O'?rI1β-!↓β↔oβ#πOOS↔Mβ&CπQα~k↔cC⊗+OO'}q↓β'~β∧4)α↓↓↓β7+;∂SN{98&&CWMβ}s∃β7N;#Qβ?∪'S∃αB∞ε2b↓I↓"5*:∞RLz9α∞|rM%%ph(4(hP4(4Ph*Cπ>)↓Q5≠⊂$$%α↓MQk)9E9_H$%α}≠S?/⊃↓I1β e]dhP0$$M##∃αfKOAα∂≠O↔7⊗ceαC⊗{∨Kπjaα2εh(4(hQ#OC.≠'π1εS?5Hh(4(L+[π3.S↔Mπ#=βSF)βπ∪'∪↔OMε{→↓β&C∃β[∞cW∃β≡+31β}1βS#*βπS?nK
↓β∨K7?bβπS?jp4)↓α↓↓α'2βπS?jβ∪?↔~β;?Qαβ#π[*β¬β[∞cW∃β≡+311ε{;∃↓εKMβ∂⊗+πS↔"β≠?IεKQ↓β6KKOQr↓αS#/→04)α↓↓↓β6{Iβ↔F7C3*`4(4PH%"6⎇2∃α¬αBNB⊗≤Jε1α
*Va%Hh($%Dj>Z⊗jα¬↓"≥α⊗∞&aαjR-~∞!%Hh(4)α↓↓↓α∞≠∂?7εc'O#/→βS#*↓β↔G.K[π3.sQβ?2↓"N⊗% ↓αj$*N∞!¬
VVaJq↓β≠∂≠3πAαβC↔KnKSMβ&C'L4R↓↓↓↓π≠g33∞∪3∃β}s3eβNqβS#*βπ∪∪⊗+OMβ6K↔3⊃ph(4(hQ#πK⊗eβπ&{5$4Ph(&↔63Wπ&+MβSz↓βS#*βπ∪∪⊗+OMβ}1↓βSF)αRR≤
I↓β}1βS#*βπKK∂I↓β←FK∂!βO→↓β?rβS#∀hQ↓↓↓αβCK?ε+KSeαβ3'O"β?_'∂#?58LK→βπ&{5↓βO→β;?"↓βg↔"↓βπ9εKKπJa↓β¬αβ∪W7oIβπK⊗d4)α↓↓↓βπ∪?C↔↔#eβ'~β∂K↔∂#↔⊃9ααS#'~β'Mβ}1βWO*β≠?Iε{C↔9n≠?∪↔"βπKK∂H'π∂≡+OO'v99↓α&C∀4)α↓↓↓α%"NεIε≠?;S∞K;Mβ
βC?'w#↔Iβ&yβS#*βπKK∂Iβ←#N≠!β#∂→βπ9εK;∪↔Bβ≠'↔f!β?→¬"Q9↓¬##∀4R↓↓↓↓ε;πK∞;∃↓β≡{33↔∨#?I↓ε[;?←~βS=↓ε3S↔∩↓βS#O→βC?NsS↔HO;#↔;/3↔I↓π##∃↓εKKπJβ'L4R↓↓↓↓π∪↔3?≡S↔⊃r↓αSgεK∂π3gIβ?;*β?C↔⊗S↔Mε{9βπrβπKK∂IβeπβWSSNs≤'SF)βπCπ∪?CKNS∀4R↓↓↓↓εK;∪↔Bβ'9α%!βπ;"βS#↔rβ';∪O∪↔∂SNs≥βSG∪?W∨BβS#∃¬"RNε∩p4(4Ph)#π≡≠'%α~k↔cC⊗+OO'}q$4(hP&↔[∞cWπS/→βS=ε ↓MYn∪'Q↓πWπ;&KSeβ≡{;O'∨#';≥ε{→βSF)↓βπ≡≠'%β⊗+CK↔≡+;Sπ&K?84R↓↓↓↓ε{→βSF)β≠'↔≠Q↓β6K[∃β/CC3?&+
∨⊃ε≠#πK∞≠S↔K~↓β?→¬→7↔cπ∪↔OON{99↓∧s?S∃αβS#π"βS#∀hQ↓↓↓αβπO∂NIβCO/+∪=7␈↓β7πJβ∨↔;/∪πS∃π≠↔[↔⊗1βNsπKeπ;?K∪~βπMβ
β3πAε3?K5b↓βW"β?;3Hh)↓↓α↓β¬β≡K;∨3*k←?K"βGWπw#'SeεMβ¬π≠g33∞∪3∃8hP4(4RCO'c⊗KQαMn+cCK/≠O'?rH4(4PJ3'/*βπO∂NI1↓β↔+QβW≡+MβSF)↓β≠O∪OQβ≡Kaβ∂FKπ∂&+KM↓ε;⊃βπ∪?∪W≡+M↓β
βO'c⊗KP4)α↓↓↓β⊗+CK↔≡+;Sπ&K?9β∂+π;SO#e84Ph(4)G≠GW?V)βπS}i%β?∩↓#OG.{k∃β6Kc;WjβπS?jH4(4PI"&R~β?;3JIαO'nK3πIπ#=βSF)βOπn('≠?⊗iβπMε β3παβ≠?KkQβCK}#W∂↔~β∧'←␈∪⊃β?0h)↓↓α↓βOG.{k∃β≡{∪∃β∂→β'S~β[π3.)84(hP4*?∨#?↔∩↓I1↓I]d$HI↓↓≠!5U9
qL$$ Page 4-33
Maclisp Reference Manual
(+ lapsyl1 lapsyl2 ... lapsyln)
Adds together the values of the lap syllables lapsyl1 through lapsyln.
(Thus note that lap syllables are defined recursively.) This allows one to
write such things as (JRST 0 (+ FOO 3)).
(- lapsyl)
Evaluates to the negative of the value of lapsyl.
(- lapsyl1 lapsyl2 ... lapsyln)
Subtracts the values of the lap syllables lapsyl2 through lapsyln from
the value of the lap syllable lapsyl1.
(lapsyl1 lapsyl2 ... lapsyln)
¬
Same as (+ lapsyl1 lapsyl2 ... lapsyln).
¬
(lapsyl)
Evaluates to the value of lapsyl. It most definitely does not evaluate
to the swapPed-halves value of lapsyl, aq some eight think! When one
writes (MKVE A,FOO(B)), the vadeE kf @ getq swapped↓EKGCUcJARβ!β'Mαβ'9β&C∀4 α↓↓↓βH¬f&/∧λfN∞LABε∞h@εv␈Dλ&.≡≡PlT~=λ
≡h~3D∞_<Y-n~→4l↑iC"AP@εE∀ P60xλ0yy`%mbli word
~∀%∂KM
β∪πS↔~β¬β3LεF/⊗≥G2εJlUbπ&TεF∂∧↔∨≡]\&gJ∞⎇w⊗"
~2π≡≡` ,Dλ_;LD_<`→Yvq62YεA⊂λ⊂⊂0zλ:42P→w2⊂'Y⊂:42H3:w1]4ww↔λ⊂⊂*4→P;0v≥p¬ oF the qyllable iq the address of¬
this remotely generated word. ha` asseMbly @]←eHA5kghA J∪C\↓S]giIkGiS=\X~∀@@@A=` β?v)β?→¬##∃β∂≠∂'∧bβ@≡O-↔"b
z"ε⊗Mx6@4≤≤y.\≠k;n∞iB*
M→(_MMxr`⊂≤9rzr≠Vs`⊂~yFE⊂λ⊂⊂⊂)→v0z4]2v4Pλ8yb`,ess here. Thus, fOp∧@AKaC[aXα)1↓αlrP∀2(λ
D
(∧
r6⊂I~α⊂&'S π%
MESCAGE!)) is perf@∃GiYrA`≠πd¬⊗"pα3[nL,Hλ¬$λ~0↔λ⊂0P,iteral referc to ∀he¬
ocation o@_AaQ
↓QSiKICXH↓αs?Qβ|1βC#*βC↔≠(ε&.v=⊂LP4w9]9:a`4ion.@A)QU`
↓ *Tm∧QQ"αα∧∧∧
αα (λ→p¬ @ T +* 1 )) wiLhλA]←β!β∪=¬3#πP∧π⊗␈*
]⊗ =≥λ⊂∩↑82q@4 froM us@%]NA≠%↓β&\4⊂@@@A¬@'v3 &α+λ0qf!p peRiat@&↓QSiKICYfAα{;#D∧¬⊗rπMRε∞LN&/∨4λ M≤8ε2πβE
λPage 4 ~fP∩∩$∧∧α↓~AP
%@_W⊂∪λ∧∩αA∨α≠S >,Z"β∩Dε∪K≠⊃Q `H⊃~FF* H
.x⊂ y\rp
Bly Proeram LAP
∀~(j\b\β!↓α∪L3β↔K,s∂πM∧∪↔S←,+9β3∂↓βπ: β∪πOd∧↔h!Q h↓Hλλ ↑8z\Y[tND~_<dY93D
89→$∞≠hλ
≤9<λ
L<λ_-lλ→X.=_8λ={<_.M8[→%@⊂⊂*4→y2P⊂_y2P7Yα
necessity, Howevep, sOme diffeRences. fasla` reads the lap code at assembly
tima, and not atlkad time, which means that read macro characters and obarray
hackery may not happen at the right time. faslap and fasload cooperate in a
scheme to gain speed by calling the function intern only once on each atomic
symbol needed by a file of functions; faslap creates a table of such symbols
and passes them when encountered into the binary file. This means that
switching obarrays in the middle of a fasload file will lose.
There are also some internal differences due to the different modes of
operation. As an in-core assembler, lap does not need to worry about questions
relating to relocatability. faslap, however, does not know where in memory a
binary file will be loaded, and thus must produce relocatable binary code.
This implies that faslap must distinguish between relocatable and absolute
symbols. This is done by using non-numeric sym properties for relocatable
symbols; the user who hand-codes lap code and expects to look at sym
properties at assembly time should be aware of this.
faslap furthermore does not know into what version of lisp the binary file
will be loaded. This poses a problem because compiled code needs to refer to
routines and locations internal to lisp, such as FLOAT1 and ERSETUP. This is
solved by the so-called globalsym convention; these labels, which for lap have
numeric sym properties, in faslap have non-numeric sym properties, and direct
faslap to output directions to fasload to find the correct value of a symbol
for the lisp being loaded into. For most purposes such symbols should be
treated as a funny kind of relocatable symbol.
faslap imposes some restrictions on the use of certain constructs. Multiple
and negative relocatability is not permitted. Relocatable symbols, the quote,
function, special, and sar0 constructs, and literals are permitted only in the
address field of an instruction.
October 2, 1979 ∪4-5.1.4 Page 4-35
Maclisp Reference Manual
5.2 LAP on Multics
A LAP program begins with the form
(lap fn type nargs)
This defines the function fn, which is of type type (subr, lsubr, or fsubr.)
nargs is the number of arguments expected by the function. In the case of an
lsubr, this is nine bits of the maximum number of arguments followed by nine
bitq of the minimum number of arguments.
Following this form is a series of "LAP words," terminated by nil.
5.2.1 LAP Words
A LAP program consists of a sequence of LAP words, or statements. Usually a
LAP word generates one word of object code, but some LAP words are pseudo-ops
which generate no code, and some lap words generate many words of code.
The allowed formats for LAP words are as follows:
A number. This generates a word whose contents is that number. Octal numbers
which LISP would Normally treat as bignums because the high order bit is
on but the number is not negative, such as 400000710120, are handled
properly. A flonum is also allowed, and a word containing the machine
representation of that flonum will be generated.
An atomic symbol. As in prog, this defines a label or tag at the current
location.
(entry fn type nargs). This defines an additional entry point. The arguments
are the same as in the lap header line.
(comment ...) is ignored.
(eval form1 form2 ...) evaluates the forms (as lisp forms, not lap exprfsym sym1 val1 sym2 val2 ...). This defines values for symbols. The values
are evaluated as LISP forms, not as LAP expressions.
Page 4-36 ∪4-5.2 October 2, 1979
The Lisp Assembly Program, LAP
(equ sym1 val1 sym2 val2 ...). This is similar to defsym except that the
values are evaluated as LAP expressions. (See page 4-40 for the details
of LAP expressions.)
(block n) generates n words of zeroes. It is unclear how useful this is, since
the code generated by LAP goes into a read-only object segment.
(ascii some text) explodec's the text and generates a string of the
corresponding ascii characters. This is not a LISP string, just the
characters themselves. If the number of characters is not a multiple of
four, the last word is filled out with zeroes (null characters).
(bind symbol value) generates a binding word for use with the binding operator.
See page 4-42.
(get-linkage) loads the lb register with a pointer to the Multics linkage
section. The external operand (refer to page 4-40) may be used to refer
to external data and procedures once the lb is loaded. lb is used
instead of lp because LISP uses lp internally.
A list whose car is a LISP macro will be expanded. This provides LAP with the
primitive makings of a macro facility. The result of the macro should be
a list of LAP words, or nil.
Anything else will be assembled as an instruction. The next section describes
the format of instructions.
5.2.2 LAP Instructions
Instructions have essentially the same format as in the ALM assembler, with
the following exceptions: Since LAP words are lists, instructions are enclosed
in parentheses. Comments must be introduced by semicolon. Index-register tags
must be in the form "x7" rather than just "7." This is because in LAP tag
fields are general expressions and are not evaluated specially. By default
numbers are octal, but a trailing point indicates decimal (as in LISP.)
Arithmetic expressions are written differently. (See page 4-40.) The rpt, rpd,
and rpl instructions are not supported. The format of literals is different
from that used by ALM. The ALM pseudo-ops, particularly vfd, are not present,
but could be simulated using macros. ALM's format for external references is
not used. The use of spaces and commas is freer than in ALM. Vertical bar may
be used freely since in the LAP reader it is a single character object.
October 2, 1979 ∪4-5.2.1 Page 4-37
Maclisp Reference Manual
The allowed formats for ordinary instructions are:
(opcode)
(opcode operand)
(opcode operand tag)
(opcode pointer|operand)
(opcode pointer|operand tag)
For instructions such as "epp" which need a register operand:
(opcode register operand)
(opcode register operand tag)
(opcode register Pointer|operand)
(opcode register pointer|operand tag)
Nkte that LAP treats comma and space Identically, and use of commas in the
above formats can make them more lIke ALM. Also, ALM lacks an opcode for spri
in the second fkrmat above, because the symbol spri is already used for a
different instruction. In LAP, use sprip.
EIS instructions and descriptors are written in the same format as with ALM,
e.g.
(mlr (pr,rl),(pr,x6),fill(040))
(desc4ls bp|-1(3),46,3)
The various fields are all general LAP expressigns, except that the words pr,
id, and rl are special-cAsed.
The tag field in an instruction may be any tag known to the machine. It may
also be the special value $. The following are equivalent:
(tnz frob,$)
(tnz (- frob *),ic)
or in ALM, tnz frob-*,ic
The pointer register names which appear in opcodes, in register fields in
the second format od instructions, and in "pointer|" fields may be chosen from
among
Page 4-38 ∪4-5.2.2 October 2, 1979
The Liqp Asseebly Program, LAP
0, 1, 2, 3, 4, 5, 6, 7
ap, ab, bp, Bb, lp, lb, sp, sb
ms, op, tp, cp, lp, rp, sp, sb, us
qs is a pseudo pointer register which points at the unmarked stack. It
actually consiqts of a combination of ab and x7, and therefore cannot be used
in EIS instructions. See part 6.6 for the standard usage of the pointer
registers.
The operand field in an instruction may take on a number of forms, which are
described in the next section.
5.2.3 LAP Operands
A LAP instruction may have either an ordinary ALM-type operand, a literal,
or a special lispish operand. In general, the latter do not allow tags.
The allowed operand formats are:
A number, a symbol, or any LAP expression. This is an ordinary ALM-type
operand. The symbol * represents the current location, as in ALM.
(% code) or (%% code). These operands are literals. The containeD code is
assembled at the end of the program and the instruction refers to that
a`dress. If %% is used$ the literal is placed on a double-word boundary*
The code may be either a single LAP word or several; since tags are
disallowed in literals, if the first item in a literal is an atomic
symbol, then the literal is taken to be a single word. Otherwise it is a
list of words. Note that inside a literal the value of * is the location
of the instruction that referenced the literal, not the location of the
literal. Examples:
October 2, 1979 ∪4-5.2.2 Page 4-39
Maclisp Reference Manual
(ana (% 000777777777))
(eraq (%% -2 777777000000))
(eppbp (% ascii Now is the time))
(tnz (% (eax1 1,x1)
(tze frob)
(tra (+ * 1)) )) ;return to loc after tnz
(quote S-expression) refers to a LISP constant.
(special var) refers to the value cell of a special variable (an atomic
symbol).
(array name type ndims) refers to an array. This is intended to be used with
the xec instruction for in-line accessing of arrays. See part 6.6.
(function name type nargs) refers to a LISP (or LAP) function. It is intended
to be used with the call (tspbp) instruction. If type is lsubr, an "eax5
-2*nargs" instruction should precede the call. One calls a function by
pushing the arguments onto the ap stack, then doing the call instruction
indirect through the function-link created by the function operand. Upon
return, the arguments have been popped and the result is in the aq.
(function ap|n type nargs) refers to a computed function, located in a cell in
the stack. This is used instead of simply tspbp ap|-n,* so that the
interpreter can get invoked if it is not a compiled function.
(external "seg$ent") refers to an external item. No tag or offset may be used.
Use the (get-linkage) pseudo-instruction to make the external item
addressable.
5.2.4 LAP Expressions
LAP expressions are used as operands of instructions, tag fields, EIS length
fields, and in general wherever a numeric value is needed. The allowed formats
are:
Page 4-40 ∪4-5.2.3 October 2, 1979
The Lisp Assembly Program, LAP
A symbol. Somewhere the symbol must be defined, by use of defsym, equ, a tag,
or the symbol may be one whose definition is built into LAP.
* has the value of the current location.
A number. This has the value of the machine representation of that number.
(+ lap-expr1 lap-expr2 ...) is the sum of the values of the lap-expressions.
The + may be omitted. If the list is empty, the value is zero.
(- lap-expr1 lap-expr2 ...) subtracts the values of the expressions lap-expr2,
..., lap-exprn from the value of the expression lap-expr1. However,
(- lap-expr) is the negative of the value of the expression lap-expr.
(symb arg1 arg2 ...), where symb is a LISP macro, expands the macro and uses
the result as an operand.
5.2.5 Using LAP
The LAP assembler may be used in either of two ways: as a translator which
is invoked from Multics command level to assemble a file of LAP programs and
produce an object segment which can be loaded into lisp; or as a lisp function
which wilh rea` a lap program from the current input source and assemble it
anto the lisp environment. In the pdp-10 implementation these are called
"faslap" and "hap" respectively, but in the Multics implementation they are the
sAme thing. If lisp tpies tk evaluate a form such as (lap foObar subr 2)( then
lap will be automatically loaded into the environment And it will read in and
assemble until nil is encountered. This mode should be used with caution since
loading lap defines a lot of funcTions which might conflict with names already
an use.
The more common way of using lap is as a Multics command:
lap name -options-
reads the file name.lap and produces an object segment called name in the
working directory. This segment may then be loaded into the lisp environment
with the load function. This is similar to the operation of the lisp←compiler
command. [[[ ??? WHAT ARE THE OPTIONS ??? ]]]
October 2, 1979 ∪4-5.2.4 Page 4-41
Maclisp Reference Manual
LAP reads forms from the source file and processes them as follows:
(lap function type nargs) introduces a LAP program. The assembler reads and
assembles until nil, then returns to this scan.
(declare ...) is the same as in the compiler. It can be used to cause things
to happen at compile time.
(%include name) causes an include file name.incl.lap to be read in the same way
as the main file.
Macro definitions (with defun or defprop) are evaluated as they are seen.
A form whose car is a macro is expanded and re-processed.
[[[[[[[[ ********** Need to discuss: operators available to lap.
+ other internal cruft. how to use macros.
Page 4-42 ∪4-5.2.5 October 2, 1979
Calling Programs Written in Other Languages
6. Calling Programs Written in Other Languages
6.1 The defpl1 declaration
The Multics lisp compiler provides a feature by which you can compile a lisp
subr which represents, in the lisp environment, a subroutine in the outside
world which has a PL/I-compatible calling sequence. The Multics Fortran, PL/I,
and Basic compilers use this calling sequence. The BCPL compiler uses it for
"main" routines. Most Multics system entries can be called from lisp through
defpl1.
When the lisp subr is applied, the subroutine will be called with arguments
derived from the arguments given to the lisp subr. Results returned by the
subroutine may be passed back to lisp either as the return value of the lisp
subr, or by setq'ing an atomic symbol.
Because lisp and PL/I use different data types, a correspondence between the
types must be set up:
Numbers. `fixed binary' with a precision not more than 35. corresponds to
the lisp fixnum. `float binary' with a precision of not more than 27.
corresponds to the lisp flonum. Nonzero scale factors, complex numbers,
decimal or pictured numbers, and large precisions are not supported.
Bit strings. A bit string of up to 36. bits corresponds to a lisp fixnum.
The bits are stored left-justified in the fixnum; thus in the case of bit(1)
the fixnum is zero for "0"b and negative for "1"b. Note that because of the
left-justification many bit strings map into "illegal" fixnums which cannot be
typed in as octal numbers. Typing in the corresponding digits would produce a
bignum. The lsh function or the "←" number-modifier character Can be useful
for inputting these fixnums. These bit strings work as either `aligned' or
`unaligned.' Bit stpings longer than 36. bits are not supported.
Character stpings. Lisp character strings and PL/I character strings
correspond directly. For input arguments, lisp will also automatically convert
an atomic symbol to a character string by taking its pname, as usual. Usually
the PL/I argument will be declared `char(*).'
October 2, 1979 ∪4-6. Page 4-43
Maclisp Reference Manual
VaryIng Character Strings. Varying character strings are somewhat special.
Lisp will take whatever string argument you supplied (the null string if it is
a `return' argument) and create a varying stringof the length you declared,
initialized with the string you supplied. Thus usually its current length will
be less than its maximum length. This varying string will be pasSed to the
PL/I subroutine. When the subroutine returns, whatever it leaves in the
varying string will be made back into a lisp string and returned (if it is an
`update' or `return' argument.) This procedure is necessary because lisp
strings may not vary in length. Note that you must declare the length of the
string to lisp; `char(*) varying' is illegal. However, the PL/I subroutine may
declare it `char(*) varying' since a descriptor is passed.
Pointers. Both packed and unpacked pointers are supported. These are both
represented in lisp as fixnums in packed pointer format, that is 2 octal digits
of bit offset, 4 octal digits of segment number, and 6 octal digits of word
offset. The null pointer is 007777000001 octal. It is not possible to
reference, within lisp, what a pointer points at. Because of the packed
pointer representation, ring numbers in pointers are not supported. If you
declare the PL/I subroutine to take unpacked pointers, which is the default,
lisp will do the conversion between packed and unpacked representations.
Raw lisp objects. A PL/I subroutine which knows about lisp may be passed
(or return) raw lisp objects. In PL/I these should be declared `fixed bin(71)'
and then the based overlays declared in sundry lisp include files should be
used. See section 14.6.
Arrays. Arrays of any number of dimensions may be passed. The arrays can
only contain numbers or raw lisp objects however. Usually you would pass a
lisp fixnum (or flonum) array and in PL/I declare it `dimension(*,*) fixed
bin(35)' (or float bin(27).) In the dimension attribute put as many stars as
there are dimensions. Proper matching of types and dimensions will be checked
at run time.
There are certain pitfalls associated with arrays. Arrays with more than 15
dimensions may tend to lose, due to the format of PL/I array argument
descriptors. Arrays as return or update arguments (defined below) are not
supported. However, the lisp array is passed by reference, so if the PL/I
subroutine stores into elements of the array the appropriate thing will happen.
If you are calling a Fortran program, you need to be aware that Fortran
reverses the order of the subscripts of multidimensional arrays.
Because lisp passes arguments by value, while PL/I passes arguments by
Page 4-44 ∪4-6.1 October 2, 1979
Calling Programs Written in Other Languages
reference, it is necessary to pay attention to whether an argument is input to
the PL/I subroutine, output from (returned by) the PL/I subroutine, or both
(updated by the PL/I subroutine.) `Output from' includes both arguments that
are stored into and values returned by a return statement. If the PL/I
subroutine has a `returns' attribute, this is considered to be an extra
argument stuck on the end of the argument list. Note that PL/I
`returns(char("))', `returns(dimensiOn(*) fixed bin)', and similar constructs
are not supported because they use a non-standard calling sequence.
Input arguments tk the PL/I subroutine are derived from arguments to the
lisp subr which represents it according to the data type transformations
described above.
Return arguments from the PL/I subroutine are passed back to lisp according
to the user's declaration; they may be ignored, setq'ed onto an atomic symbol,
or passed back as the value of the lisp subr. If more than one is passed back
in the latter way, they are consed up into a list. If there are none, nil is
returned.
Update arguments are a combination of the two types described above. They
are derived from the arguments tk the lisp subr, and they are also passed back
like retuRn arguments.
Now the detailed syntax of the `defpl1' feature will be described. It is
anvoked by using the defpl1 declaration in the lisp coMpiler, in a Form
generally as fOllows (note that noThingin this "form" is evaluated):
(declare (defPl1 liqp%name eXternal-name abg-dcl-1
arg-dcl-∩ ... arg-dcl-nRR~∀4∃YSg@[]C[∀ASfA¬\ACi=[SFAMs[E←0XAoQ%GPAo%YP⊃β⊗)β∪↔4K;↔⊃εM⬬≠WI¬;#↔9αβS#∃ε{WSC/ 4+∨2βS#∃ε≠?7CL¬F∂&≥⎇bαε≡4εf↑≤LV"p~MεO~∧∞7.↔$
vNfD∞F∞↑T∧ε∂~
\⊗wJ≡&?.\]g'~∧↔~πMPhU EtJπ>\'⊗␈↑M⊗v*
↔~ε≥nπ/"≥f"π↑F∂&T↔⊗?]\Vw'5aPPh$∧αε/∞LW⊗v≥EVv∞\TεO~∀π∨'-≥f:π⎇
⊗≡B
≡2π&Tεv∞\Tε}2∞Mε*π>\'⊗␈↑M⊗v*∞Mrαε,Tε≡∞MLV"`Q,↔~ε≡Dπ>␈]LBε⊗T∞w⊗ONLVpN≥d¬∧by∃bα∧≤dεO"
≡2αα$%Bπ&Tπεv≥\Rε}d
FO∨¬]f∞nQ≡vNfD&(h.↑6."∞=rπ&≡BπN}Tεv.\Dεv␈D∞GOεT∞FF*∞<⊗n*∞MεNvt∞G>N<U`hPQ$ααε≡,rn&=ES
πM∞&␈.⎇∧ε∂⊗u\F≡b]dε∂⊗T
FO∨N5bα∧\≤6Bε⎇lRε>≡lW~πMRε∂NN&N↔↑LW~ε|dε}vQQ&}2∧∞FF*≡&?.\]g'~∧∞Fzα∞Mε*¬ EtJα∞>V↔⊗}↑FNvUdαα∧m≡'∨"∂≥w*α
↑W∨ ≤⎇↔6*≡G'⊗≤.W&/1Q&&/<>&N⊗≥lrπ>↑FF/$
↔"ε≡4ε∞r
≥gπ/EDπ/εL≡F*b
}"π⊗↑NW⊗r≡&?.\]g"p~Mε/≡T↔⊗+!Q hR∧∧ααβMmrε∂NN&N↔↑LRε>≡lVsv≥dεNw∞↑Bε∂,}Vn.nAPPh)|7&},↑"β∩Dε∪K;⊃⊃⊂Jα∧∧↓≠"VecλH⊃∀ααα∧∧α¬ε≤|Rβ"VFPhP`H⊃∀αα∧\≤6fO>∧¬⊗.l↑&.v<T∧n∞n\⊗`h!Q hR∧∧ααπ,↑G/⊗a⊃∩ε
∞,W'/-dαε∂,}Vn.nEBπε≡>6."∧&∞≡4↔~α∞Mε*πl≥G.*∧
v2πMPhP⊃⊃∩π∨\."ph!Q"αα∧∧π⊗/N↑&rε≤⎇f␈⊗Q∀ε
π,↑G/⊗d↔⊗?]\Vw"∞⎇εN≡∧
↔~ε≤⎇f␈⊗\E`hPQ$ααα∧∞&/'↑-bαG<↑G
πl≡"HJ∀π⊗/N↑&rα≡&?.\]g"πMtπ>F≤=ααπMRε∂M⎇VN~∞?⊗n⊗⎇Dαπ6≡$εO_Q!⊂HJ∞<W'
|\Brα∞l↔∩π=
w.fD&*εL\6f∂,\Bπ∨\6N∞EaPPh$∧ααα∞↑ε&∂LQ⊂Jε≥dπ/εL≡F*α≡&?.\]g"b∞↔∨≡\Dε⊗∞=4αε∂4∞FF*∞l⊗g.T∧ε}2∞Mε(h!⊃⊂Jπ>\'∩pQ!PRα∧∧απ/L↔&*
≤vv␈,Q∩ε∞d∞Wε&≡LRε∂,}Vn.nDπ>F}<Rπ⊗↑NW⊗v\Dπ6∞N\RεO4
⊗>v},V"pQ!PRα∧∧απ/L↔&*¬∞6/'∀∞f∂∩⊃∀ε∞r∞↑ε&∂LTε∂⊗}]V.wD∞vF␈<Tπ⊗/N↑&v.D∞f∞g\Tπ6∂$
↔~π<↑G
>\APPH⊃∀π&zaQ hR∧∧∧v/∞DπN␈T∞7ε.=≤gJπMRαεL≡F
πO≡ε*ε≡NG⊗N.↑F/~D
⊗rα∀ε6␈-Tπ∂.≡LRπ≡≥]⊗f∂$∧π&z∞Mε(h.|↔Jπ≥}Rπ>}]F"ε≥d¬∧by∃`JD.↑Bε&⎇dw"εm}&>/D∞FF∂D∞FF*LV≡f≡,↔&N⎇dε}2\⊗≡B≡&?.\]g h-≡2ε.l=F␈≡\DεNr
≡G~ε}⎇bπε≥≡"ε}d∞ε∂⊗]nFF/<↑2bε≥n7&.≤Dε}2,VNvt∞6/ε≡,↔&.Dg⊗}T∞FF(Q-w&F↑.0O>≡Mαε≡⎇]V∂~e⊃∃&FT∧ε6}MMw>Nltε↑/≡⎇w⊗'4∧ε∂⊗T∞&.≡|⎇fOV\Dαε6}$αε&≡L∩π'≡PhV≡NG⊗N.↑F/≠!Q hP∀fOF\A∩αα∧∧ε6f|≡@Jε-≥f∂↔∀∧ααα∧&NpQ!∩ε⊗≡A∩αα∧∧πε}≥nF/⊂∀∞π'⊂∀∧ααα∞⊗≡↑\EWπ'!Q Jπ≤6↑.E↑ε}NnLW⊂H∀6F∂,≤7&/$∧αε≡≡"ε∞M≤vv.AQ Jπ]l⊗fN⎇lV"α∧
FO∨↓∀ε∂↔,∨⊂Jα∧∧απ6≡/⊗NvqQ hR∧∧∧v␈LTαπ&≡Bεπ≤6↑.E↑ε}NnLW∩8≥≡2π/<\Bαπ,≡FF/$∞FF∞d∧επε⎇≥g&/!≡Vv∞M≤vv.EDrε∞lAPVε≡.&∂Jt∧εO~∞↑6."∧∞&∂&↑"π&≥bαεM⊗n.n=⊗}rdtαεεM≡7α:∧
V.∞n4ε
α∞,↔:α
M↔∨α
|&V.>E`hU∞,V≡O=≥vw~D↔↔⊗∨∀αε/∞LVw'5Dε∞vD∞7'⊗≥lpNf]lw&G4↔⊗*∞>ε.≡≤m⊗."∧↔~π≡&.wMW≡O,\@hVn]V⊗/.4ε␈∩≡7&/-≡6←~D
'/∨D↔~ε≥d¬∧by∃`Lv}LRπ&≡Bπ.mLW∨~∂≥w*αLV≡f≡,Rε␈MW↔>≡<PhWMtπ&FT6}o
≥F/∩
}"απ∞↑Bε
LV≡N\≥Bπε⎇≥g"b∧∞FF/<Tεw.\,W↔~∞⎇⊗fb,Rαε≥nF/↔∞,W&.D↔_h-|7&∞EaPPh$∧α∧F↑,RεO4⊗rε←⊗oεLUBε∞NMε␈.⎇∧εv␈D
v2ε∀∞f/↔∀∞W≡.n]Bε≡≡<SPh!Q"αα∧∧ααFL\6f∂,TαF&\nεc
7≥zM≥fO&≤≡F*α$$αF≡≡"BR∃∀αF≡≡"BR∃∀αF≡≡"BR∃⊃PPH∀¬ε6O\Bε⊗≥eβ
J∀¬ε6O\Bε⊗≥eβ∩J∀¬π⊗/N↑&rπ
⎇⊗w&↑%⊂hP⊃∀αG⊗↑NW⊗r¬∞6/'∀6}&U∀ε6O\Bε⊗≥eβ≠*e∃∩JHQ!PRα∧ ⊗2πM
↔~π|≡2ε≡⎇↑εNf\Dε∞vD
F}∞L\BεNnMrεf≡>αbπ≥}Rε≡}]F"πO≡ε(h!Q"αα∧∧ααα
7≥zM≥fO&≤≡F*α'n7O∨L]U}≡⎇nG⊗}Kv∩∩α.⎇ε␈&≤$"α∩$εαβα⊃Q hU≤v*βEVC0H⊃∀αααα6Bk2f⊃⊂HJ |7&},↑"β∩Dε∪K;⊃Q `H∀∧∧≡∞MM⊗v:
∞&}?,≥W~¬}-↔'&]dεNr }FF/$ F∞v}\⊗>/1Q hPQ$ααε≥lBεf≡>απ>}]F"π,↑εgJ∧∞vO&∧∩εw]\&/∩∞>V≡B∧↔~β6Vcββεεβαb≥f"ε=|F*α∞⎇w.fD
ε∂6QQ&⊗.]dπ≡/N∀v."∧∞Fzβ¬Dαππ,↑7.n≤-GJr∧
FF*∧.vF␈L≤"⊂N=}Vf"∞Mε.r∧&*ε≤<6/∨<\Bαπm≤∩ε∞aQ&/GL↑&v∞D↔↔⊗∨∀αG≡\Tπε∞|Tβ∩kπ∃∩ph!Q"αα ≡BεO4∧εNo
}'&∞nDπ&z
mw&*∧∞FF∂D∞FF*∧F.7
F∩ε&\=F∂⊗≡M⊗}r
≡2αεm}Bε↑m}vrα∞Mrπ&QPVNnLW↔π,↑F/∩d∧∧
εL\gεc∃\F.6≥lV"εn]f∨&≥⎇bεn∨∀ε⊗*<⊗ff\Dε↔J
≥g&/.∞&/&\DεfO>∧ε≡}LU@hV.↑Bπ&Tαπ≡}↑&≡*
|bαπMRε&\nεcλ≤LV≡f≡,↔&N⎇dεo/>Dαεv↑lW↔&]F/∨4&*α=voε≥LV"ε≥l@hVM|⊗&.D
⊗w&t∞FF*
M↔∨α]g6O-⎇fn.nDε⊗.m}&*ε≡Dε≡∞d&*π↑<V"r∧λf␈∩∞MεO~∞,V∂≡⎇eBεOD
↔_h,∀ε>}|DεN&\∀π&z
<V/αLV7εF∀w~α≥f"εL\g.r}4εNr∞<Wε∂,≡F*εm≥F/~d∧¬&FT∧ε&.n
C
?4
V∂HQ,&*π
L⊗≡.D
⊗rε≥dεNv=NV&*m⊗f*∞⎇εN≡∧∧εO~∧]⊗v≡N\F*>D'JπMRε␈MW∩εm≥F*π⎇Vrα
≡BεO1Q&≡}↑
⊗f.EDε∞vD∧εn∂∀⊗g≡t&*α=voε≥LV"π<↑ε∂⊗≡LVgJ∞⎇ε.r∧∞FF*
≥g&/.∞&/&↑$εO~∧∞Fzε,QPW/<\Bph!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hT|>F}⊗↑$β∩bε↔∪;H⊃⊃∩αα∧α3"kef⊂HH∀∧ααα∧∧¬ε∞|Tβ"kFqPP`H⊃∀αα∧\≤6fO>∧¬⊗.l↑&.v<T∧n∞n\⊗`h!Q hSef"α¬∞-v'.=≥f:εl≡6f}≤L⊗⊗fTfNf↑4π>OM∧π&FT VN&≡4∧∂∨<]V⊗f↑!PPh!Q"αα ]⊗&∂46∞r≡7≡.\-F*∧h~4bεm≥F/~∞Mε∂"<⊗rε,Tεf}≤LV"ε/∀∧dM:∧εNr∞Mε*α∞<⊗n*
\⊗vv↑!PV∂46}o
≥F/∩
}W'π↑Ebαα
MεO~
]v&*
≡2ε.nLW⊗.D∧ε↔J∞Mε*αhh∃≤b∞∞6/.MuV␈αD∧π>F≤=αεo↑>@hV≡∞ε.∂$↔"πMRε⊗\⎇⊗vv≥lrε}d∞FF*m⊗f*,V6␈,Tε∞w∀∞7&␈,≤v*π⎇}&'~aQ hR∧∧∧∞7L↑"ααhh∃≤b
↔~α,V.r∞<V.rD∧π&FT↔∨≡]\&gJ∧&.≡⎇\W~ε∀∧π'>t∧πε∂>4π⊗.M|6∂&≤-F(h,≡7≡.\-GJr∧ ε␈>↑lW∩b<W↔&≥≥bπ⊗↑>G⊗N>M⊗}w4⊗v"∧,6F∞l|W~ε|dεNwL↑'π⊗↑L↔&N⎇d"ε∂∞
GJpQ!PRα∧λvf},≥Bαπ?≥V⊗}N4ααFL\6f∂,\Bε∂4∧π/∨\≥Bαπ⎇≡FBα$∧ε␈∩∧¬d<dx(∀bJ∧↔⊗*∞W⊗n≡>6N⊗LU`hT
}v/6↑%Bπ≡≥l6*πMRε␈↑Nπ/"
≡2π&t&*εM|⊗&.D∞vO&∧f∂≡M|⊗"π↑=⊗v:λHE"?4∞7Nn-⎇Bπ&≤-F(h-≥g∨&\≤Bε}d
5$Li5Bπ&↑&*ε≡,Rπ∂]≡F*ε∀f/:M⊗66↑,Vv≡↑4εNrLW&∞≥E`hPQ$αα∧m}"π∨≥\&}g4F.6≥lV O⎇≡FFNd∞FF*>W↔⊗]nBε∂><Vn⊗O∃BαπMRε}mO∩ε.llV∨"∧
v2ε,]⊗v8Q,F.≡L≡&."λyD|∀→DεO~∞Mε∂"∞Mε*∧yIt∀D
⊗v6}-V∂&≥⎇bεO4∞ε∂∨<\Bε}d∞Fzεl≡6f}≤Dπ>F]dπ&FQQ'∨N\-vbπL≤&f*
≡2απ}-↔'&]dε∂"∞Mε*α]f"ε|dπε∂>4β∩r∧∧¬&F≡4εNr9vn⊗≥l↔&N⎇dαπ>≡Mαπ&QPW∨≥\&}g4∞7>OL=αεNdf∂≡M|⊗"εL↑F/⊗]≥f/~∞⎇ε/&↑"π&Tπ∨N\-vbε|↑G~εM|⊗&.D∧εNwMt∧$∃ |aQ\};,-{λ≥≤[→+D∧∩9H∞∨;8[mNhλ~.P74f⊂77P≤|rq7[9P;t[4∧ be loaded; if the valqe od αsYmbolS is the atomic symbol symboLpεPA←9Yr@A≥YP∨∞cEβ←Lc!↓β⊗)β3?∞#↔⊃mαβπ;⊃∧K⊂$≥K7?e→β'M¬!1βπdaβOGn∪?3MαC3?∂∞a↓βπv!β∨3|∪π1%∧εvNfD&*εM|⊗&.E`α∧}l8RαπMRπ∨≥\&}`Q-π
α
Hl≤→1¬
βy∧w≠z∀V⊂≥42P⊂~w37i≠pz4g[⊂0yPλ:7P4]9P⊂#S'a f≠2yyP~yP⊂6≠yz∧p[2⊗⊂/d∧~¬G=kegJ0A[CW∃fA]↑↓IceI!KdA %MMKe∃]GJ\A)QJ↓S]Ci%CXAgQCiJA]QK\A1∪' A%`
↓βf{π&X@εO_Q M≥ C"AP¬⊂⊂⊂⊃f#aS⊂9|vX7v9P≠7z⊂"→q4w2Y⊂4w⊂≤42P!]y92w≥⊂0y@3embly are also hegal, bu@PAiQKal restrictions as to where in a storage word they may appear and
what masking may be specified (as compared to a normal relocatable assembly).
Briefly, they may appear in a storage word as a full word, a right half, a left
half, or an accumulator. They may be negated, but can not be operated on with
any other operator. Error printouts will be produced if they appear elsewhere.
When the symbol is encountered by fasload, DDT's symbol table is consulted. If
it is not defined at that time, fasload will try to find a sym property on the
atomic symbol with the same name.
Any sort of global parameter assignment or location assignment is forbidden.
.LOP, .LVAL1, .LVAL2, etc are not available.
The following pseudo-ops are available to facilitate the communication
between MIDAS assembled programs and LISP (particularly with regard to list
structure).
Page 4-48 ∪4-6.2 October 2, 1979
Calling Programs Written in Other Languages
.ENTRY function type args
Note that the arguments to this pseudo-op are separated by spaces, not
commas.
function is an atom and is taken as the name of a function beginning at
the current location. type should be one of SUBR, FSUBR, or LSUBR, and
has the obvious interpretation. args is a numeric-valued field which is
passed through to fasload and used to construct the args property of the
function. If it is zero, no args property is created. Otherwise it is
considered to be a halfword divided into two 9-bit bytes, each of which is
converted as follows:
byte result
0 nil
777 777
otherwise n n-1
These two items are then cons'ed and form the args property.
The following pseudo-ops may appear in constants.
.ATOM atom
Followed by a LISP atom in "MIDAS" format (see below). May only appear
in right half (or entire word) of a storage word. Assembles into a
pointer to the atom.
.SPECIAL atom
Similar to .ATOM but assembles into a pointer to the (special) value
cell of the specified atom.
.FUNCT atom
Similar to .ATOM, but invokes special action by fasload in case the
pure switch is on. Normally used in function calls. Briefly, if fasload
is going to purify the function it is loading, it must "snap the links"
first. If .FUNCT is used, the location will be examined by fasload and
the link snapped if possible before purification. Typical usage:
October 2, 1979 ∪4-6.2 Page 4-49
Maclisp Reference Manual
CALL 2,.FUNCT EQUAL ;calls equal As a function of 2 args
; note: the CALL is not defined
; or treated specially by MIDAS.
; (but see .FASL DEFS below)
.ARRAY atom
Similar to .ATOM, but assembles into a pointer to the array SAR.
.SX S-expression
Similar to .ATOM, but handles a LISP S-expression. (See below).
.SXEVA S-expression
Reads S-expression. This S-expression is evaluated (for effect
presumably) at fasload time. The resulting value is thrown away. Does
not form part of storage word.
.SXE C-expression
Similar to .SX but the S-expression is evaluated at fasload time. The
resulting valqe iq assembled into the storage word.
The MIDAS "LISP READER"
By a conspiracy Between MIDAS and fasload, a VersiOn of the LISP reader is
available. However, duE to Historical reasons (mostly, i.e. the fasload format
was originally antended only to deal with COMPLR type output), there are a
number Od "glitches" (see below for list). These will probably tend to Go away
in the fullness od time.
a) numeric ATOM
The fiRqt character of a LISP atom i@LAKqC5S]KH↓gaKG%CYYr8A∪LA%hASf↓B@FA=` ↓→`h+C#*βπS?jβ'Mβ&+∂3π⊗+⊃βSzβ∃βw+7πN→βπ≠ β↔'SF+Iβ≠Hπε."¬2Jε}$ε&F|≡FNvt¬α2Jd∧∧nNL≡0hWMVrπ∞-v≡.\N2απMtεNw∞↑Bαε∀↓f␈⊗\≥Bαεn]V/⊗≤4ε6N]LBαα∞LW⊗N≥l↔&.EDεv␈LUBαε/∀ε.OMW⊂h.>ε∞≡T∧ε␈∩=vnn∃∃bαα
MεO~∧∞f∞g\TεO~∧∞FF.d∧α↔∨M}&."$
⊗rα∞Mε*α≡ππ⊗}
&N∂LTα↔∨≤6*⊂Q%ε6O
nVjπ>⊗≡*
z"ε6M⎇g.j∞>ε∞≡U∃`hPQ("Jε}Mε/∩λ~DlO4¬ε∞g=tε↑v}⎇bε∂4
∧tXTε∂&⎇↑2ε␈$¬∧dM:¬∩¬≥→X$|e5⊃PPH*⊗>*εAS+⊃⊃∩αα∧α3"kef HH∀ v∨&|,W∩β%Dβw⊃PP`H∀∧∧≡∞MM⊗v:
∞&}?,≥W~¬}-↔'&]dεNr }FF/$ F∞v}\⊗>/1Q hPQ$αα∧≤dπ&FTfO↔>Dαε≡≡&∞∨L↑"ε}d∞FF*∧↔&}T
↔~εm}@J~
}"α2D∧π&FT↔&}T
↔~α∀α∃∧h→T*⊂Q,↔&}Udαzε,\6}n↑4ε
π=≥f>fT6F∂,≤7&/$∞↔.␈LTε≡F≡,⊗∨&↑$ε∂~
≥b∧d~:αpMMRε∂M⎇Rεn∨∀ε⊗(Q-⊗v&\m⊗vOL]GJεM⎇f:r∧
FF*≡F}j∞⎇⊗fb,Rπ&↑-VNv≡LV"ε/∀ε∞r∞]g∂.}LV O>⊗≡*D6∂↔-≤⊗>(Q.&/'↑-bbπL≤"bᬬBαJD
w⊂O<]VN≡⎇Mvrr∧
Vw∂]}F."
M⊗v.l\V'_≤≡&*ε≤⎇f␈⊗\Dε∞vD∧ε&z
mw h,,V≡}\Tπε∂.Dε}2∞Mε*ε≡Mvjr∧
FF*∧6F∂,≤7&/$∞FF∂D∞F/⊗]≥f∂&↑4π&FT↔&}T
↔~α∧.W≡.D∞Wα⊂Q.Vvf↑>2εOD
↔~ε∀¬αε␈$¬∩pLm}F*α∞Mε∂"∞W⊗N|DεO~∀εf.|≥Bε≡⎇n7&ON\Vw"
|bε
∧↔&}T⊗v Q,F}/4
f␈"∞LW⊗n≥l↔&*
≡Bε␈$⊗∨"∞>ε.≡≤≥FgJaQ hV5∀εfO>N0hPQ$αα∧M≡7'~∞⎇w⊗Z
mw⊗n≥MGJb.W"εm}F*εm⎇Ff␈⎇≥f:ε<≡W&N⎇dπ⊗.L≡FO6T∞FzεM}Bεv}L↔&N⎇g"ααaQ&&}↑4εv␈D∞F/⊗]≥f∂&T↔&}↑5bα¬M∞W~b∞Mrαε≥nf}↑TF␈"
mw&∂M≥vrb∞Mε*εM}Bεo↑>@N⊗T
F.7AQ&&.M≥VO&\Dε↔J∀π∨ε≤<RbπL≤"bπ≡&.wMW≡O5Dε␈∩
zFF/$6F∂,≤7&/$
FF∂D∧ε&}↑4π&/-]⊗v∂LQPV∂M⎇W~pQ!PT>M≡F≡F↑7 hPQ$αβ
∀∧¬⊗/>N&N∨M≥vrε⎇dαπε≡8d∧→→<]Y→;ND≠~<nDλ≤⎇∞.8⎇≥.,(λ%T∩;H∧;↑(∧
~<⎇∧∞Y89
≥Yc"D∧λλλ
}→<X.M;{K∧
[h≠L↑h_=
⎇<h≠M}λ≤≤L↑Z;⎇.=≡(→-l{⎇;NL<Y9∧
8>(,"9;L=⎇;]↑Y9λm|C"D∧λλλ∞M→(→M≡\⎇α.M;9(
⎇Hλ≤≡|hEd∩≠⎇l↑Y<K∧∧≥~~.4≤Y<nNZ8⎇
≥{HλMy<h
m⎇λλ≡≤≠≡$∞≠c"D∧λλλ≡≠{+-⎇[≡(∞,89~-lh≠|↑X=~-⎇\h
¬h5∪s%DTtλXr+λ¬hU3PjD→=_e∃C"C!$λJ$
z;YmL(≤=-}→(→M}H≤=-}~;Yd∧→≠y.4≠[⎇∧>~<nD
≠[d
⎇~→.$≠88n-hλ_m<X8nL<\h←~<⎇↓QHλλ∧∧→:=
<KJ!QC"H∧εj(∪N]8Y<N4≠=<nD_Y(m_9yl\λ_<d8[⎇LT_;≥l∨<kC!!"B(∧∧λλ∪)zQ2(λ∃P5 y(,F1(λλ∧∧∞s∪j84h$z=Y.4≤≠z-n→<C!!"""$∧λλλπ4≥≠h
P31$∞≡<→$=≠{!QB""!∀λλλ∧πh≥z.Mλ∀∪H→1(&&kH~.D~<c!!"""$∧λλλπ4≠[⎇∧
];9.-8kC!$λλλ∧∞<y.AQB(λ∧∧λ∪3jh2(⊂%EP5∪iTλl,F4λλλ∧∧∞⎇z-nc"C!$λ
$ [hλ∞∞[⎇Z.=;{H←~<⎇∞4λ≥≠d∞rence "GLOBALSYMS" in fasload. This mostly
means only that DDT must be present to load a MIDAS assembled FASL file.
(Some simple COMPLR and LAP FASL files can successfully be fasloaded by,
for example, a disowned LISP running without a DDT.)
5) LOC is illegal in a FASL assembly. BLOCK of a non-relocatable quantity is
ok.
October 2, 1979 ∪4-6.2 Page 4-51
Maclisp Reference Manual
α
6) Currently( symbol loading is very slow. Thus use (symbols nil), (the
initial state) unless symbols are necessary*
7( Midas doeq not know about any LISP symbols op∧A+=bAga∃GSCY1rT@@↓3←jAMQ←kY⊂~∀@@@A@]%→'%(↓'3&t9
β'_%
&≤\∪)Q%fAMS1J@AG=]iCS9bAIK→S]Si%←]fA=H@Age[E←YLAM←d4∀@@@ACIX↓→∪' ↓CGGk5kYCI=efAC9H∪++=bP@]≥→∨¬β0AIKFαcπKπ&K?;Mε3?Hπ∞c1α≡dz∀J;∀m~AQ"αα∧∧ε∞vDF.6≥m↔&N⎇n2ε6} π∞}\TεNwL↑&v∞A→DM≥∧
V∞∨-}2π∨\9αε∂4 D|≤9∀αε∞βY
YS∪pi9+C"D∧λλλ
M~<hM;→(
≡h→⎇,≡X;]\9λ∃
t_Y(∞↑λ≥≠d_=→$∞z;XlT≥~→$<|q-\[~(
|H∪∩*:λ~=∞≤;→C!$λλλ∧∞8q0→H4z↔εB∧¬
8) .ATOM "should"AEJA∧@Agaα+∂'πb↓β∂π≤∧Rαε|dαu≥∧∧αrα
w>/lXEDλ~=∧∧~<h
9Y≠\β"H∧∧λλ∀l↑_8X.L9≡(,8x=.<(≠p∪λ:42P→5v6']tw#@ "reasons":
a) The previ@=kgYr↓]←iK⊂AeKgQ`'∂&K?9βx¬bπε≡0d→<⊃-l→;]∧ ∩4u
5C"H∧∧λλ_E∀⊃:1≡h_p-d→≠h={\⎇≥]≤h
}≥~;-∨X=~-⎇H≠p↔λ0z7f\P0pλ→py4w→P4w_ww9z_w:9P
5wεEαq3r4λ80y@3 one and pass two) bqt @9←hA←8A→∪'Q&\A !KeKM=aJXA∃CGP∪1SghA%b~∀∪≥kCeC9iKKH↓iVAi¬WJAB↓cCaCICiJA]←eHA%\AiQ∀AG←]MiC@;'→βπK. β↔[,qβ'→αβ'QβO_4('N#↔;SN≠π1β&yβO?n)β?SF+Iβ3O≠Qβ←FK∂!β∞cO=β∂βC↔π↔→β'9ε β∂?w≠Sπ≠"p4)↓α↓↓β
Jα↔π∂Bβ3'O"βSπ∂/→βπ9ε∪∪'&K?;πbβ↔;S↔Iβ'9ε3πO3}⊃∨Mα∪πS?j⊃βSπ⊗c∃8&&C'MβO_4(≤∀πε.↑
wε∂/∀π&∞-LRπ&≡BεO4fG∂=V"ε≤nF/∩∞Mε*εl≡6f}≤M⊗v:
≡2ε≡⎇↑εf/LUbα∧|aPPN=}W↔≡UDαe≥∧∞7&NMDπ>␈->2αεmxD=≠{.4≠;q∞]≠h≥
(_8M}Y(λ
m⎇→9∧∞Y<u∞4qz4[w9FEαpw2 inefFicencies.
¬
α¬
α
α¬
α¬
Page 4-∃2 ∪4-6.2 October 2, 1979
Maclisp Refepenc@∀A≠C]UCX∩∩$@@@@@@~∀4⊂∩∧h8j@A∪9iKe]¬XA∪[AYKK9iCIS=\A KQCSIF4∀~∀~(@@A)!SfAg∃GiS←8AIKg
aSEKL@AiQ∀AS]i∃eECX↓[CGQ%]J[Y∃mKX@↓IKiC%YfA←_AiQJAmCe%←kf~)S[aY∃[C]i¬iS←]L\@Aβ8Ak]I∃egiC9IS]N↓←LAi!SfA[¬iKeS¬XASf↓]←hA9KGKgMCerA%\@A←IIKd~)i↑AkMJAYSM`XAEUhAShASfA!KYaMUXAS\↓oeSi%]NA→¬ ∪G←⊃JAC]⊂AS\AU]IKeMiCMI%]N@AQQJ~∃=kiakPA←LAQQJAG=[aSY∃d\~∀4∀~∀h8n\b@↓)QJAAI`Zb@A∪[a1K[K]QCiS←8~∀~∀4∀~∀h8n\d@↓π←]m∃]iS←9fAM←HA
k]
iS←]LAS\A1Sg`~(~∀~∀@A)Q%fAgK
iS←\↓EeSK→YrAI∃gGeS KfAg=[J∪←_AiQJ↓S]iKI]CXA
←]mK9iS←]LA←L∪AI`Zb@~∃YSM`XAC9HAG←9iCS]LAK]←UOP@A%]M←e5CiS←8AM←d↓BAaKIg←\@↓oQ↑A-]←of↓aI`ZD`@A[¬GQS]∀~∃YC9OkCO∀Ai↑@↓k]IKIgiC]⊂AiQJA←kiAkhA←_∪iQJ↓G←[a%YKdXAC]H↓a←gg%EYr@↓i↑@A]eSiJ4∃gS[AYJAY¬`AMk9GiS←9fAM←HAkgJ↓oSiP↓YSg`8@A⊃←]KmKd0AiQJ↓S]M←I[CiS=\AoSQQS\@↓iQSf4∃gKGQS←\A%fAgk UKGh↓i↑AG!C]OJ8@A/Q∃]KmKH@AC]dAY←G¬iS←\↓oSiQ%\AYSM`ASfAeKM∃eeKH4∃i↑AMs[E←1SGCY1rAS\↓iQSf↓gKGi%←\XAQQChAMs[E←0@ASf↓aeKI∃MS]K⊂Ai↑A1C`AC9HA[Cd@AEJ4∃kgK⊂AErA¬]rAY¬`Aae=OeCZ↓KmK\↓SLA ⊃(AI←∃fA]←PAQCm∀AYSg@OfAge[E←YLAY←C⊃KH\~(~∀@@↓)QJA9C[Kf↓←LAi!JACG
k[kY¬i←ef↓C]HAQQKSd↓kgKf↓CeJX↓EeSK→Yrt~(~∀@@`A]S0@@@@ACi←4AQKC⊃KdA←_AiQJ↓Ci←[%FAgs5E←XA9SX~∀@@bA∧∩@@@@AMSIghACIOk[K9hAi↑↓BAMk9GiS←8vAmC1kJA←_AMk]
iS←\4∀@@@HA∧∩@@@@AMKG←]⊂ACeOU[K]h4∀@@@LAε∩@@@@AQQSeH↓CeOk5K]h~(@@@h↓β$b@@@@A→←kei ACeOU[K]h4∀@@@TAβ$e∧@@@@↓MSMi ACeOU[K]h4∀@@@XA(∩@@@@A9KOCi%mJA←_AiQJ↓]k[E∃dA←L↓CeOf↓i↑AC8AYgk dvAi∃[`~∀@@nAQ(@@@@@AgUaKd[QK[a←ICerv↓mCYk∀AMe←4A]k[∃eSFA→k]Gi%←\~∀@b`A⊂∩@@@@AgK5R[iK5a←eCIrvACISiQ[∃iSF~(@@bb↓$∩@@@@Ag∃[R[i∃[a←e¬ervA¬eSiQ5KiSF4∀@@bHA∩@@@@AMK[R[QK[a←ICerv↓CeSi![KiS~∀@@DfA
%∃βε@Ak]kMKHXA∃qGKaPAgCm∃H←kg∃H←eKMi←eK⊂AErA≥F~∀@bhA $@@@@AeKOUYCdAAkgQI=o\AY%gh@QAIXRAA←S]i∃d~∀@bjA
1 @@@@AMY=]kZAAIXAa=S]iKH~∀@@DlA
1@@@@@AMSq9kZAa⊃XAa←%]iKd4∀@@b\A' @@@@@↓gaKG%CX@QYCeSC YJAE%]IS]≥fRAa⊃XAa←%]iKd4∀~∀~)!COJ@hZjL∩∩∩@@@@&DhZ\n$∩∩@@↓≠CeG @lX@Drnr~(_∩∩∩$∩∩∩∩$@@@@@@~∀4∀~∀@A∪\A≥K]Ke¬XX∪&5Kqae∃ggS←9f@Ag!←kYHAEJA5C]SaUYCiK⊂@AS\AiQJ%MSmJACeOU[K]h4∃CGGU[kYCQ←efv↓iQJA
←]iK9ifA←_@AiQ∃gJACIJAae=iKGi∃H@AEdAiQJ↓OCeE¬OJ@A
←YYK
i←d\4∃%C]⊃←ZACISiQ[∃iSFAMQ←kY⊂A]←h↓EJAI=]JAS8AiQK4vAiQ%fA[S≥QhAC
GSIK9iCYYdAOK]∃eCiJ4∃iQJ↓CIIe∃gfA←_Ag←[∃iQS]≤AiQJ↓OCeE¬OJAG=YYKGQ←dAg!←kYH↓]←hAAe←iK
h\@@↓βeOk5K]if4∃i↑AMkEefACeJ↓aCgg∃H@Ai!e←kO AiQKMJ@AM%mJ@A¬GGk[UYCi←IfXAC9H@Ai!JAmC1kJ@A=L@AB4∃Mk]
iS←\↓SfAe∃ike]∃H@AS8ACGGU[kYCQ←dAα8@@A)!JAgS9OYJA¬eOk[∃]h@AQ↑AC\↓MgkEH@ASf4∃YSW∃oSgJ↓aCgg∃HAiQI←kOP↓CGGk5kYCi=dAα\4∀~∀@A∪hA%fAOK9KeCY1rACgMk[KH↓iQCh↓oQK\↓C\ACIOk[K9hASf↓aCgg∃HA←d↓BAmC1kJAe∃ike]∃H~∃i!e←kO AiQKMJAMSYJACG
k[kY¬i←efAiQCPAiQCPAiQJ↓YKMhAQCY_AoSY0AEJAiKe↑XAoQS1J~∃i!JAeS≥QhAQ¬YLAo%YXAG=]iCS8AB@AA←S]i∃dAi↑↓C\A&5Kqae∃ggS←8\@A≠UGPAG=IJ@A⊃KaK]⊃f~∃←8AiQJ↓YKMh↓QCYL↓EKS]≤AuKe<vAS\AaCeQSGkY¬dXAi∃gifA→←dA]%X@Qo!SGPA%fAiQ∀@AuKI↑~∃a=S]iKHRAkg∀A∃+≠A
AS]MiekGQS←]f0AoQS
PAeKEkSeJ%iQCh↓iQJA1KMhA!CYLA JAuKI↑@Ag<~∃iQ¬hAiQ∀AiKgPA←LAQQJAe%OQhA!CYLA]SYXA JAmC1SH\∪%\AOK9KeCX0AiQK8XAS]MiekGQS←]f4∃YSW∀A⊃%%hAC]H↓⊃→%4↓gQ←k1HAEJ↓kgKH↓i↑AM∃iGPA%iK[f↓S]i↑↓iQKg∀ACGGU[kYCQ←ef\4∀~∀@A&[KaaeKgMS←]f↓CeJAIKaeKMK]iK⊂AS\AMkGPA∧AoCR%iQCh↓SLAB↓a←S]QKdAi<AB∪I=iiKH4∃aCSHASfA%\XAg¬rXAC
Gk[k1Ci←d↓αXAi!K\~∀4∀∩∩∩$@@Q⊃1%4A∧`AαR4∀~∃o%YXAO∃hXACLABAa=S]iKHXAiQ∀AGCd↓←LAi!JA&[∃qaeKMgSO\↓C]HAAkhASPAS\@↓CGGk5kYCi=d∩∃∧0AC]H4∀~∧∩$∩∩@@!⊃%%4↓∧@`A∧R~∀~)oSYX↓OChAQQJAGα#I9↓∧K→↓β&C∃αMn+cCK/≠O'?rβ←#?≡)βπ∪'∪↔OMεKE↓βLqα¬βI→β¬β6Kc+Wh↓β?HhS≠&⎇nVjb∞Mε.pQ!PPH⊃⊃∩αDYzd*¬JDβα∧∃⊃PPh.⎇⊗fB|W"πMRεn≤=εNvT∧π⊗/∞,W∞.nL↔&Nut it in accumulator
TT.
Accumulators T through F may be used as scratch registers, in general.
When an lsubr is called, however, the negative of the number of arguments is
passed in accumulator T. Many useful internal routines are called by JSP
T,FOO, and the argument or value is commonly passed in TT. Functions compiled
by the fast- arithmetic compiler return their values in TT. TT is also used
in coNnection with array accessing.
FREEAC is presantly unused by the lisp system, except for the garbage
collector, which, however, saves and restores it. This fact should not be
taken
March 6, 1979 ∪14-.7.2 Page 4-54
Maclisp Reference Manual
as permanent; it is mentioned primarily because it can be useful for debugging
purposes. One day soon this accumulator will be renamed BAR and used as a
base address register for relocatable binary programs.
The pdp-10 lisp system uses four pushdown lists, or stacks. The regular
and special pdls, whose pointers are in P and SP, are marked from by the
garbage collector; thus an S-expression is "safe" from gc if pushed on either
of these pdls. (Only the right half of each pdl slot is marked from; the left
half may contain garbage.) The special pdl is used to hold variable bindings,
and its contents are highly structured. The user should not use SP except
through the routines SPECBIND and UNBIND, described below. P may be used for
any purpose, provided that totally random things are not put into the right
halves of pdl slots (the same restriction as for argument accumulators). The
fixnum and flonum pdls (pointers in FXP and FLP) are used primarily by
compiled code produced by the fast-arithmetic compiler, and their contents are
not affected by gc in any way. If it is desired to save random quantities on
a stack, the fixnum pdl should be used if possible.
The standard function calling convention in pdp-10 lisp requires that
functions be effectively called via a (PUSHJ P function) and exit via (POPJ
P). The arguments to subrs and fsubrs are as described above. Lsubrs take
their arguments on the regular pdl (where they are safe from gc), and T has
minus the number of arguments. The return address is also on the pdl, under
the arguments. This usually requires code of this sort:
(PUSH P (% 0 0 G0475))
(PUSH P A)
(PUSH P '(funny list))
(MOVNI T 2)
(JRST 0 FOO-LSUBR)
G0475 --- lsubr returns to here ---
That is, the return address must be pushed ahead of time. It is the
responsibility of the called lsubr to remove its arguments from the pdl and
return with a POPJ.
Interfacing between compiled code and the interpreter is accomplished via a
large set of UUO instructions. All of them work in the same fashion: the
effective address must be the address of an S-expression which is the function
to be invoked. The arguments to this function are passed in the manner
described above, and the accumulator field describes which argument passing
convention has been used (hopefully the same as that required by the called
Page 4-55 ∪14-.7.2 March 6, 1979
function): 0-5 means a call to a subr with that many arguments, 16 means a
call to an lsubr, and 17 means a call to an fsubr. Thus the function CONS
might be called with the UUO (CALL 2 (FUNCTION CONS)).
There are several variants on this basic UUO type. One variant is the JRST
vs. PUSHJ Mode; sometimes instead of writing a PUSHJ to a function one wants
to write a JRST for efficiency. To see why, consider that
(PUSHJ P FOO)
(POPJ P)
is in effect equivalent to
(JRST 0 FOO).
This kiNd of UUO is also useful For cAlling lsubrs (see the example above).¬
A secOnd variant is the "clobberable" Vs. the "unclobberable" UUO. If
certain cOnditions are met, it is possible for the UUO handler to replace the
invoking UUO by the equivalent PUSHJ or JRST, so that next time the same code
is used it will call the desired function directly. In some cases, however,
it is not desirable for the UUO to be so clobbered, for example if the
fqncTion to be invoKed iS an argument in an accumulator, and is to be invoked
via something like (CALL 1 0 A). A UUO may therefore specify that it may
never be clkbbered.
A third option is usedby code cOmpiled by the fast arithmetic co@5aSYKH\~∃∪PASfAU]IKg%aCEY∀AM←d↓BAMk9GiS←8AoQS
PAeKQke]f↓BA]k5EKdAQ↑AI↑↓B@E]U[EKdAG←]LD~∃S8A←eI∃dAi↑↓eKikI\AiQ∀∪]k[ KdAβLAC\AL[KqaIKggS=\ASLAiQJ↓]k[E∃`AoS1XA←]1r@AE∀~∃G←9mKei∃HAEC
VAi↑ABA[¬GQS]∀A]k[ Kd@A¬]HAkMKHAS8@A[←IJA←a∃\[G←⊃KH@A¬eSiQ5KiSF8~∀Q∪PASfAU]IKg%eCEY∀AEKG¬kgJA9k[EKH@AG←9gSMN0AYSW∀A←eI%]Cer↓G←]g%]NX@↓KmK]QkCYYd~∃GCUgKfA≥CeEC≥JAG←1YKGi%←\XA¬\AKqAK]gSYJAae=GKgf8RA)QUfABAU+≡A[¬rAga∃GSMrAiQCP~∃Sh↓oC]iL@A←]1rAB@↓[CGQ%]J@A9k[EKHACf@↓B@Ae∃gkYhlAiQSL@ASfAi↑A J@Ae∃i`↔Kv+⊃↓βLp4+π≡≠W7WdS/I¬"Q1β⊗S#↔∩βS#πpβ¬β3O≠Aβ;.k↔I∧¬⊗r∧∃aPPH$∧α¬&Tεnv]]vvN>4ε6|H⊂⊂[4⊂:4→yrP*UgyP0\2P9z[vpy4↑2r⊂4→y2]εBεE∧DBP1f /bberable uncloBberable
@!U'⊃∀∩@A∃%M(@@@@A!M⊃∀@@@A∃%M(~∧@@@@AMiCMI¬eHAe∃gkYh$Aπβ→0∩@@A)πβ→_@@@A
β→ @@@A)πβ→→_~∀@@@@A]U[KeSAeKgUYh∩A9πβ→_$@@A≥)ββ→_@@A≥
β→ @@A≥)ββ→4∀~∀@A)QkLAiQJ↓KqC[AYJA←_AC\A1ckEd↓GCYX↓CE←m∀Ao←k1HACGQkCYYdAEJA]aSii∃\t~∀4∀~∃≠, 1979 ∪14-.7.2 Page 4-56
Maclisp Reference Manual
(PUSH P (% 0 0 G0475))
(PUSH P A)
(PUSH P '(FUNNY LIST))
(MOVNI T 2)
(JCALL 16 (FUNCTION FOO-LSUBR))
G0475
Functions produced by the fast arithmetic compiler follow a convention so
that NCALLs will work properly: If a function is to be NCALL'ed, and returns a
fixnum, the first instruction of the function should be (PUSH P (% 0 0 FIX1));
if it returns a flonum, the first instruction should be (PUSH P (% 0 0
FLOAT1)). (For a description of the FIX1 and FLOAT1 routines, see below.) If
the function is NCALL'ed, the function is entered at the second instruction,
i.e. after the PUSH. The appropriate machine number is returned in
accumulator TT, as expected by the caller. If, on the other hand, the
function is simply CALL'ed, then it is entered at the normal entry point, and
the address of FIX1 or FLOAT1 goes on the stack. When the function exits, it
will transfer to FIX1 or FLOAT1, which will convert the machine number to a
lisp number and then return to the original caller.
Some other UUO's besides the CALL UUO's are useful to compiled code and
hand- coded lap. The STRT (STRing Typeout) UUO is quite useful for printing
out constant strings of characters. The effective address of the STRT UUO
must be the first of several words of sixbit characters. Several characters
in the string have special significancE8 ↑ Complement the 100 bit of the
character Before printing it. (This occurs
after 40 has been added to convert it to ascii.) Thus ↑M in the sixbit
string causeS a carriage returf to be printed. SimiLarly, ↑4 iq a lower
casE t.
! Terminate typeout.
# Quote the nexp character. This is used to get #, ↑, and ! into a string.
Thus, For eXamplE, to print the messace "YOU LOSE!" in lap cOde, preceded
and followed by a Carriage returf, qay
(STRT 0 (CIXBIT ,π=≠3=*↑A→='
F↑∧←=~↑∧RR~∀4∀Q)Q∀AgYCMQKfA¬eJA]∃GKgg¬erAE∃GCkg∀AYC@↓oSYX↓eKCH↓iQSf↓kgS]≤AiQJ↓YSg`↓eKCI∃dBR~(~∀@@↓)QJA1%$@!→Sg`A%%=dRA+U≡AiC-Kf@A∧Agie%]N@A1SWJAQQJA←9Kf@AM)%(AQCWKf0@AC]⊂~∃gS≥]CYf↓C\Ak9G←ee∃GiCE1JAKeI←dXA]SiPAQQJAgQeS]N↓CfAi!JAKeI←dA[∃ggCO∀\@A¬∃GCkg∀~∀
∀4∃!CO∀@@hZTn∩α∩@@@&DhZ\n8d∩∩∩@A≠CIGP@l0@brnd~∀_∩∩∩$∩∩∩∩$@@@@@@~∀4∀~∃i!JAKeI←dASL@Ak]
←eeK
iCEY∀XAG←9ie←X↓]KmKH@AeKQke]f↓i↑AC→iKd@↓iQJA1%$v↓Sh@A%b~∃Y%WJAB↓∃%'(↓iVAi!JAKeI←dAQ¬]IYKHX~∀~(@@A)!JA→Hf@A+U≡@ASL@AgS5SYCd↓i↑@A1%$XAEkhACYG<AiCW∃f@AC8@A&[∃qaeKMgS←\AS\~)CGGk5kYCi=dAαv%iQSfAKqaIKggS=\@Ag!←kYHAEJ@↓MWYY=oKH∪ r@Ai!J@AgQaS]NAoQS
P~∃G=]giSQkiJAQQJAKIe←dA5KggC≥J\~∀4∀@@AQQJAI∪≥(AU+≡ASLAkgK⊂Ai↑AMSO]C0AG←eIKGiC YJAKIe←ef8∪∪hAQ←↑Ai¬WKfA∧∪gie%]N~∃¬eOk[∃]hAC9HAC\A&[KaaeKgMS←\A%\Aα\@A)Q∀ACGGU[kYCQ←dAM%KYH@↓←LAi!JA%%≥(@AU+≡~∃%]ISG¬iKfAQQJAieaJA←_AKee=dt~∀4∀∩@@@`∩@↓k]IK_[M]GQ\~∀∩@@@b$@Ak] ]H[mIEX~∀$@@@@H∩@AoI]N[ieaJ[CIN~∀∩@@@f$@Ak]MKK\[≥↑[iC≤~∀%α↓↓↓PJ↓β←Kv97;=nK∨LhP%↓↓α↓T%↓ε;
73␈≠Oπ∨*↓#?,M⊗v∂-≥GJπ↑<V"ε⎇mGJε)∀ε>~⊃Q Jα∧∧β0J∧f∞NE\⊗∨ Q!∩αα∧εpJα
→rnf}>6∞>QQ hR∧∧¬&FT
2n/∞∞&/∨=≥vrε,\6}n↑4π&FT∧ε∂⊗}YV.wDλ
t≥~→$∧→<\M}H~;NL<X].∞λ~_-l≠→<D∧→[p→βE:42H3t{2[⊂:<x→Dws⊂→y97yλ⊂∀4wλ:42Pλ1pybH7s⊂⊂≥<x2yH_⊂⊂:≠P→V⊂λ:42P→y97yλ⊂40w→62yεB0zz7[pz4qXv6<P_x864YyP:4→P3:w_z4wwλ71ww≤P:7Pλ:44yH7q52Xz⊂12Y7y2P≤0yyt[3P4zλ⊂0yFB:42P_y3zfYw:∀Wαds⊂:~2P40[262yλ92z:\79P0H⊂1wy≤2qz2Y⊂;0v≥rP∀2K3W⊂:~2P:yYy⊂4wλ⊂0FE≤z0w2_y2⊂2\97y⊂_92puH:yrrλ:42P≤2z:y≠⊂⊂3:[1z4w[∀P:4→w⊂:4~yP72]P;0v≥rP4yBx0yyYrεE1_quP4[⊂ P0[2⊂1w[:97vλ92z:\79P:≠P:42H4w9z≤:qz4[w⊂0s≥2y⊂*~2P"i∩g*↔εBεE⊂⊂λ P:<\4qpvλ84rqYP7s⊂≠0x⊂1[r2P:≠P:yrH:44yH6tst≥⊂12]βEαE∧H⊂∀& T⊂#'gH)ja)
FE∧DH⊂∀(*Td⊂(⊂⊂TFE∧H⊂*"iU∧P⊂∀∩)h⊂*λ#,'+∀P⊂⊂λ⊂⊂≥sYz⊂7:[ry4qH;0v:YP4w⊂→εE∧DH⊂∀*)∪"P"⊂TDP⊂λ⊂⊂≥{Xw:⊂ H6zv:~x62P≠s⊂~εB∧DP⊂
%))jλ_⊂&'TbTFEαDP⊂↔λ↔⊂↔εB∧DP⊂
('h%λ(∀FEαP⊂&'TbDP⊂
"l!dλ P!∀BP⊂⊂⊂λ≥srzλ10r⊂_y3P$[⊂0FEαDP⊂∀⊃i$g*λ→⊂∀∩H)dl!∩h⊂''U⊂ P&Uf*$h∪"P'cλ~∀TFB∧DP⊂
"h!dλ P!∀BP⊂⊂⊂λ≥y{t]1t⊂1_quP0YptwεB∧DP⊂
%))jλ_⊂*"Tj∀P⊂λ⊂⊂⊂≥YwP:9≡P0spZwεE∧H⊂'$fβEαEεBεA&p\1t⊂≠⊂_\[ND@DPλ⊂⊂ XM⊗W≠G∧@DPλ⊂⊂⊂⊂∀0srPλ~⊗Z\βEβ∧DDPλ⊂⊂&pXv4yxλ)2s"\2w1`% Manual
α UUO's never change the valueS in any AccumulatorpεAKq
KahA∃%∪≥(0AoQS
P@A[¬r~∃e∃ice\↓B@A]∃nAmC1kB@A%\@Aα0AC]HAiQJ↓mCeS=kf@A
β→_@↓++≡OLXAoQ%GP@A5Cr@A
Y←EE∃d~∃KYKesi!S]NA%LAiQ∃r@AQ¬mJAi<AS]m=WJ@A∃mCXAQ↑AYS9V@Ai<AC\A%]iKeAeKiK⊂@AMk9GiS←8\~∃π¬→_A+U≡OfAMCmJA¬YXAC
Gk[k1Ci←eLAoQK8@AYS9WS]N↓Me←Z↓←]JA
←[aS1KHA←H@AQC9IG←I∃H~∃MU]GiS=\Ai↑↓C]←i!Kd\@↓)QSf↓S[aY%KfAi!ChAi!JAGC1YKHA→k]Gi%←\Ao%YXAO∃h@Ao!CiKm∃d~∃o¬fAaY¬GKHA%\ACG
k[kY¬i←ef↓(AiQI←kOP↓ACf↓oKYX↓CfAα↓iQe←UOPAβHeα\@↓∪hAI=KfA]=h~∃S5aYrX↓Q←oKYKdXAQQChA¬]rAC
Gk[k1Ci←eLAoSY0AQCm∀AEKK8AaeKMKemK⊂AErAQQJAi%[JAi!J~∃G¬YYKH↓Mk]GQS←\A!CfAe∃ike]∃HAi↑↓iQJA
CYYKH\~∀~(~∀h\\\f@A%]iKe9CXA%=kiS]∃fAM←HAkgJ↓ErA→¬ Aπ←⊃J~∀~(~∀@@↓π←[a%YKHA
←IJAIKckSIKfABAGKeQCS\AMKhA←_AgkaA←eh@↓e←ki%]Kf\%)QJA9C[KfAC]H4∃CIIIKggKLA←LAQQKgJ↓e←ki%]KfA¬eJAaIKIKM%]KH@↓i↑AY¬`\@A%hAgQ=kYHA9←hAE∀@ACgMk[KH4∃iQCPAB∪O%mK\@↓e←ki%]J∪g¬mKf@↓C]r@↓CGGk5kYCi=ef@AU]YKgL@AShASf@↓gaKG%MSGC1Yr~∃⊃KgGe%EKHA¬fAI←%]NAg<X∪)Q∃rACe∀AEeS∃MYrA⊃KgGe%EKHA!KeJt4∀~∀Q)' A(↓'!π ∪≥λR4∀@@@A)QSLAe←kQS]JA!C]IY∃bAiQ∀AES]⊃S]NA=LAga∃GSCX↓mCeS¬EYKf8@A)Q∀AGCY0ASf~(@@@@↓M←YY=oKHA rA←]∀A←dA5←eJAMaKGS→SGCi%←]fA=LAiQ∀AM←e4@QisAJAoQ∃eJ@QMaKGS¬X~∀@@@ACQ←ZRR0AoQKIJAisAJASf↓KSiQ∃d@o>PbA←d`\@AQQJAm¬YkJA=HAiQ∀ACi←5SFAge[E←X4∀@@@ACi←4XAoQ%GPASLAS\AQQJAo=eHAa=S]iK⊂Ai↑A rAiQ∀AKMM∃GiSm∀ACIIIKgfA=LAiQ∀~∀@@@ACe≥k[K]PXASf↓gCmK⊂A←\AQQJAgAKGSC0AaIX0AC]H↓BA]K\AmCYUJASf↓aYCG∃HAS\↓iQJ~(@@@@↓mCYk∀AGKY0XACf↓gaKG%MSKH↓ErAieaJAC9HAoQ∃eJ\@↓∪LAE=iPAieaJAC9HAoQ∃eJACIJ~∀@@@Au∃e↑XAQQJA]ue is nil. If ype is zero, then where is the number of
an accumulator containing the new value. If type is 7←41, then the new
value is in the regular pdl slot addressed by subtracting where from the
current contents of accumulator P; where may be any number less than
2000 octal. (This is a case where not truncating the accumulator field
of a lap instruction to four bits is very useful.) Any number of
specifications may follow the call to SPECBIND; the end of the call is
determined by the fact that a valid pdp-10 instruction within lisp cannot
be zero in the first nine bits or ones in the first three. All the values
pushed in a single call form a single bind block; this fact is used by
the UNBIND routine. SPECBIND destroys the contents of accumulator R.
(JSP T (SPECBIND -1))
This is an alternate entry to SPECBIND, which has the additional effect
of passing all new values through the routine PDLNMK (see below)
before placing them in the value cells. It is used by code compiled by
the fast-arithmetic compiler. [[[ HAS THIS VANISHED OR SOEMTHING? ]]]
Page 4-59 ∪14-.7.2 March 6, 1979
(PUSHJ P UNBIND)
Pops one bind block off the special pdl, thus restoring the old values of
the atoms whose values were formerly saved. Example: the following lisp
code and lap code are roughly equivalent:
((LAMBDA (SPECVAR) (ZORCH)) 'BARF)
(MOVEI B (QUOTE BARF))
(JSP T SPECBIND)
(0 B (SPECIAL SPECVAR))
(CALL 0 (FUNCTION ZORCH))
(PUSHJ P UNBIND)
UNBIND does not destroy any accumulators.
(JSP T PDLNMK)
"Pdl number make". This routine examines the S-expression in accumulator
A, and if it is a pdl number it replaces it with a freshly number-consed
copy. Used by code produced by the fast-arithmetic compiler. Does not
destroy any other accumulators, even TT.
(JRST 0 PDLNKJ)
Equivalent to
(JSP T PDLNMK)
(POPJ P)
(JSP T FXCONS)
Takes a machine fixnum in accumulator TT and returns an equivalent S-
expression number in accumulator A. The value in TT is not preserved.
No other accumulators are disturbed. Another name for FXCONS is FIX1A;
they are entirely equivalent. Note that lisp fixnums are represented in
such a way that the address in A will point to a word containing what
was in TT.
(JSP T FLCONS)
Similar to FXCONS, but takes a floating-point machine number in TT, and
returns a lisp flonum in A.
March 6, 1979 ∪14-.7.3 Page 4-60
Maclisp Reference Manual
(JSP T FXNV1)
Verifies that the S-expression in accumulator A is a fixnum; if it is
not, a correctable wrng-type-arg error is signaled. If it does contain a
fixnum, or if the error break eventually returns a fixnum, then it
returns with the equivalent machine fixnum in accumulator TT. This
routine is useful primarily for the error checking; if it is already
known that A contains a lisp fixnum, the instruction (MOVE TT 0 A) serves
just as well. Such knowledge, for example, can be derived from
declarations by the fast-arithmetic compiler.
(JSP T FXNV2)
(JSP T FXNV3)
(JSP T FXNV4)
Similar to FXNV1, but take arguments and retqrn machine fixnums in
different accumulators:
FXNV2 B -> D
FXNV3 C -> R
FXNV4 AR1 -> F
There iq no FXNV5 - yoe must move an argument in AR2A into some other
accumulatkr first.
(BSP T IFIX)
TakeS a Machine flonum in TT and converts it to a (truncated) machine
fixnum, returned in TT. Destroys accumulator D.
(JSP T IFLOAT)
Takes a machine fixnum in TT and converts it to a machine flonum,
returned in TT. Does not destroy any other accumulators.
(JRST 0 FIX1)
(JRST 0 FIX2)
(JRST 0 FLOAT1)
(JRST 0 FLOAT2)
These are convenient exits to the following code internal to the lisp
system:
Page 4-61 ∪14-.7.3 March 6, 1979
FIX2 (JSP T IFIX)
FIX1 (JSP T FXCONS)
(POPJ P)
FLOAT2 (JSP T IFLOAT)
FLOAT1 (JSP T FLCONS)
(POPJ P)
(JSP T FLTSKP)
Verifies that the S-expression in A is a fixnum or flonum; if it is not,
a wrng- type-arg error is signaled. If it is, then the machine number is
returned in accumulator TT; moreover, the return skips if it Is a flonum.
Example: here is a simplified vepsion of the sub1 function which does not
accept bignums:
(LAP SUB1NOBIG SUBR)
(ARGS SUB1NOBIG (NIL . 1))
(JSP T FLTSKP)
(SOJA TT FIX1)
(FSBRI TT 0 1.0)
(JRST 0 FLOAT1)
NIL
(BSP T (NPUSH -n))
This routine pushes n nil#s onto The regular pdl; i.e. it is equivAlent
to writing PUSH P (% 0 0 NIL)) n times. n must be between 1 and 20
octal. Note the minus sign in the above: to push 4 nil's one writes (JSP
T (NPUSH -4)). This routine is used greatly by compiled code to create
pdl slots for local variables.
¬
(JSP T (0PUSH -n))
Similar to NPUSH, but pushes zeros onto the fixnum pdl. n must be
between 1 and 10 octal. Used by code produced by the fast-arithmetic
compiler.
(JSP T (0*0PUSH -n))
Similar to NPUSH, but pushes zeros onto the flonum pdl. n must be
between 1 and 10 octal. Used by code produced by the fast-arithmetic
compiler.
March 6, 1979 ∪14-.7.3 Page 4-41
Maclisp Reference Manual
(JSP D *LCALL)
This routine is called by user lsubrs produced by the lisp compiler. It
accounts for the number of arguments, and saves some information so that
the arg and setarg functions can find the arguments. After the user
lsubr has been executed it takes care of popping the arguments off the
pdl and returning to the caller.
(JSP D (*LCALL -1))
Used by user lsubrs declared to be of type fixnum. It performs the same
setup as *LCALL, but also sets up a number-consing return by doing (PUSH
P (% 0 0 FIX1)). *LCALL skip-returns; the following instruction is
always (JSP D *LCALL).
(JSP D (*LCALL -2))
Is like F3(*LCALL -1), but is for flonum-type lsubrs.
(PUSHJ P IOGBND)
Used by compiled code to perform the iog function. Equivalent to the code
(JSP T SPECBIND)
(0 0 (SPECIAL ↑W))
(0 0 (SPECIAL ↑Q))
(0 0 (SPECIAL ↑R))
(0 0 (SPECIAL ↑B))
(0 0 (SPECIAL ↑N))
(JSP T (*MAP -n))
Used by compiled code to call the various mapping functions in the common
case where there are two arguments. The function should be in B, and the
list in A. (This is backwards from the standard order!) n determines
which mapping function as follows:
1 maplist 3 map 5 mapcon
2 mapcar 4 mapc 6 mapcan
Page 4-63 ∪14-.7.3 March 6, 1979
(JSP T *SET)
Used for compiling calls to the function set. Accumulator A should have
the value (second argument to set), while AR1 should have the atomic
symbol which is to get the value (first argument to set).
(JSP T *STORE)
Used for compiling calls to the function store. (The conventions for
this routine are undergoing some change, and thus are not described here.)
(PUSHJ P *UDT)
Used by compiled code for handling undefined computed go tags in compiled
progs. The tag is in accumulator A. It handles the case where the tag
is really a fixnum; and if not, signals a correctable error and possibly
returns with a corrected tag in A.
(JSP TT ERSETUP)
Used for compiling calls to the function ERRSET. Accumulator A has the
second argument to ERRSET, and B has the address to go to if an error
occurs. This routine pushes various things onto the regular pdl.
(JRST 0 ERUNDO)
If all the code compiled for the first argument to an errset runs without
error, it must go to ERUNDO to undo the errset, i.e. to pop the things
off the pdl which ERSETUP pushed. Control is returned to the address
given in B when ERSETUP was called.
(JSP T GOBRK)
Used by compiled code when a go is done within an errset (yech!). It is
similar to ERUNDO, but returns to the instruction following the (JSP T
GOBRK), rather than to the place specified to ERSETUP.
(JSP TT (ERSETUP -1))
Used to compile calls to the function catch, which internally is similar
to errset. Accumulator A contains the second argument to catch (the
catch tag), and B the return address which is used if a throw is done.
March 6, 1979 ∪14-.7.3 Page 4-64
Maclisp Reference Manual
(JRST 0 (ERUNDO -1))
Just as ERUNDO undoeq an errset, so ERUNDO-1 undoes a catch.
(JSP T (GOBRK -1))
Similar to GOBRK, but breaks out of a catch rather than an errset. This
is what a throw compiles into.
ARGLOC
This is not a routine but a variable, which contains the address of the
pdl slot just below the arguments tk the most recently called lexpr or
user lsubr, or zero if none has been called. Thus the call (ARG 2) may
be coded in lap roughly as:
(MOVE T ARGLOC)
(ADDA T 2)
(HRRZ A 0 T)
This iq one of the variables set up by *LCALL.
¬
ARGNUM
This, like ARGLOC(λASLABAm¬eSCE1J\∪∪PAG←]QCSMf↓iQJA9k[EKHA←LA¬eOk[∃]ifAQ↑~∀@@@Ai!JA[←β≠QβK,≠↔;Q∧¬F/G∞$ε␈∩∞↑6/∩∧
G∂..$ε≡∞MEBε∂4∩εf≡>αεw]\&/∩d∧ααF≤86/∨=≥f8h$∧αααλ~$<UYPεNvM≡&.∨MO∩π>≥IBαε|dε≡␈↑.6(Nl↑F≡B∞Mε*ε\≤6FNlTαεw]\&/∩e∀α¬&∞↑2αε⎇lPhR∧∧ααε]≤vG"∞}&O&T∩ε7]l7&N⎇g hPQ$ααα∧∧ααDH~α∧
(ybk∩
:T∃∩⊃Q"αα∧∧αααλ~$=~λ~$<rV$αDt→Dαrβ¬∃⊂hP∀∧ααDYzd*¬JD∧α∧~(tu,U⊃∩αβ<|W"εn]V⊗/$
v"ε≡,w_h!∀αααλ8∀L<T
E"β5⊃⊂Jαπ=f..D↔"εL\↔∨"ε1PPJ∧∧αDdZ*"βα¬∧R¬≤≠λ$M" HU≥~
I∧rε4∧
∀z5∩Hh!∀αααλ_D"¬JD∧
∀yIt~H∀∧β↑6↑L6BπMRεf≡>@hP∀∧ααDλ*%R∧∀¬S∩¬JE⊂Jαπ0ε∂⊗t'/"ε!PPJ∧∧αE∧z "¬α⊃Q"αα∧∧αα∧i→@hPQ!PS"fuc"α
-w/&≥lW~∧m}"¬/<Tε↔J ⊗v"X=v&.D D
Q!PPh!Q hU≤v*αεES3(⊃⊃∩αα∧α3"β+MeFb""$∧λ∪8.,zλ
ED.-g⊃"@
There are some routines internal to pdp-10 lisp which are not used by code
produced by the compiler, but which may be of use to those writing functions
in lap. Unless specified otherwise, the symbols for these routines are also
predefined to lap.
(PUSHJ P PRINTA)
This routine is the internal lisp print function. It does not actuallq
perform any output, but merely supplies a stream od characters. It is
called with the S-expression to be printed in accumulator A, and the
address of a routine in R. The sien bit of R controls the use of
slashes:
zero means produce characters like prin1 and explode would, one maans
like princ and explodec. PRINTA will generate characters and pass them
one at a time to the routine specified in R by placing the ascii code in
accumulator A and doing a (PUSHJ P 0 R). (This violates the rule about
putting non-S-expressions in gc-protecTed accumulators, buT for numbers
less than about
2000 octal this is guaranteed tk be a safe procedure anyway.) The
routine may do anything it wants to with the character, buT must av@=SH~∀@@@A⊃Kgie=sS]N↓iQJ@↓G←]i∃]ifA=H@AC
Gk[k1Ci←eL∪∧XAX@A)PX@AC9HA$XAoQS
P@ACIJ~∀@@@ACMgk[K⊂AErAA%∪≥)∧Ai↑A J@Ag¬MJ\@↓∨\Ai!JA←i!KdAQ¬]HX@↓β$bA¬]HAβHeαACIJ@A]=h~∀@@@AC1iKeK⊂AErAA%∪≥)∧AC]H↓[CrA JAkg∃HAi↑↓G←[[U]SGCQJA←m∃dAgk
GKgg%mJAG¬YYfAQ↑~∀@@@Ai!JAe←UiS]JlAJ]N8AiQKdA[Cr↓Q←YH↓EsiJ↓a←S]QKefX↓KiF\@QβO¬S\XA∧@AmS=YCiS=\~∀@@@A←_AiQJAekY∀XAEkP∪iQSLASf@↓CYXAISOQhACfA1←]N@↓CfAi!Kr@AA←S]h↓i↑∩EMCMJD4∀@@@AaYC
KfHA1SWJ@↓aIXAMY←ifA←dA S]Ced@AG←⊃J\RA]QK\@↓!%∪≥QαASfAI←]∀ASh@↓oSYX4∀@@@AeKiUe\Ai<∪iQJAS]gQekGi%←\AC→iKd∪QQJ@AA+'⊃∀Ai↑A%h\@@↓)QJ@↓G←]i∃]if@↓←L~∀@@@A¬GGk[UYCi←HAαACIJA]←PAaeKMKemK⊂\@AaC[aY∀t~∀@@@A⊃∃eJASLABAMU]]rAYKegS=\A←L↓MYCiAoQS
PA←]1rAG←U]ifA
CaSi¬XAYKQiKef8~∀~∀$@@@@!→β A¬→!⊃→¬)εA'U¬$R~(∩@@@Qβ%∂LAβ→!!→β)εQ≥∪_\@bR$~∀∩∩!!+'⊂↓ @PJ`@`A→∪0bR$∩wSh≥fA≥π¬→→CE1JB~∀$∩Q!+M⊂A
1@@PJ@@RR∩w
←k]i∃d~∀∩$Q≠∨-∃∩Aβ$Iα@`A→1 R∩meK[K5EKdA]QKeJ↓ShASL~∀∩∩!⊃%%∨$A$Aπ=+≥(R$∩wae%]FAgQsYJ~(∩∩Q!U'⊃∀A@A!%∪9)αR~(∩∩Q!= A
1@A)(R$∩wa←@AG←k9h~∀∩$Q!∨!(A R~(∪π∨+9(∩Qπ¬∪∂
A∧@b`b$∩∩w←9YrAG=k]hA
CaSi¬X~∀∩$Q!∨!(A R∩$vAYKQiKef4∀∩∩Q
β∪∞A∧@bfd$~∀∩∩!β∨&@@@`AβHeαR~(∩∩Q!=!∀A $~∀∩@@A≥∪0~∀~∀4∀~∃≠¬eGP@XX@br\r∩∩∩@@@&DhZ\n8h∩∩∩@@@@↓!COJ@hZlT~∀_∩∩∩@@A≠¬GYSg@A%KM∃eK]G∀A≠C]UCX∩∩$@@@@@@~∀4∀~∀QA+'⊃∀↓ A∂Qπ∨$R4∀@@@A)QSLAgs[ ←XASLA]←h↓W]←o8Ai↑A1C`vA%hASf↓S]iK9IKHAAeS[CISYrA→←dAgegiK[L~∀@@@Aae=OeC[5KefA=\A∪)LAoQ↑↓]KKH↓YCeO∀AEY←
WfA←_AG←e∀AM←d↓gaKG%CXA∩=≡AIKYSGKfl~∀@@@AQ←]KmKd0AShA¬Yg↑A∃qSgiLAS\A⊃KFZb@AYSg@\@A∪PASfA
CYYK⊂AoSi AiQJ↓]k[E∃d@A←_~∀@@@@c⊗↓EY←G-fA←L↓G←eJ↓IKgSIKHAS8A)(\%→Sg`↓CYY←
CiKf↓BAgS9OYJA Y←GV↓←L@A
←eJ~(@@@@↓iQCh↓YCeO∀AC]H↓eKikI]fAi!JACI⊃eKgf↓←LAi!JAMSIghAo=eHA←_AiQJ↓EY←G,AS\@↓)(\~(@@@@↓∪hA[¬rAIKMie←r↓gKmKICX@A=iQKd↓CGGk5kYCi=efAS8AiQJ%ae←G∃gf\@↓→Sg`↓[Cr@↓←d~∀@@@A5CrA]=hACGQkCYYd@AGCUgJAi!JAG←IJ@Ai<AKqSMhvASP@A[KIKYrA¬YY←G¬iKf@↓CIIe∃gf~∀@@@AMaCGJ↓C]HAAe←[SMKfA]=hAi↑↓kgJA%hAM←HAC]sQQS]N↓KYgJ8@A)Q∀AGCY1KdAg!←kYH↓I↑~∀@@@AQQJACAae←aISCiJ@]π¬1⊗AGC1Yf@A=\A∪)L@Ai↑↓GCkg∀@AiQ∀AG←e∀@Ai↑↓KqSgP\@@@!∨\~∀@@@A⊃KFZb@AYSg@AoSY0AGCkMJAiQ∀AG←e∀Ai↑A∃qSgh0AM←d↓iQJAAeKgK9h\R~(~∀~∃%≥⊃∪¬%(~∀@@@A)!SfASLABAm¬eSCE1JAoQ%GPXA%LA]←8[uKe<XAga∃GSMS∃fAiQ¬h@QB$AkgKHAS]i∃eekaQf~∀@@@A[¬rA]←PAEJAAe←GKMgKHX↓EkhA5kghA JAIK1CsKH0AC]HQDRA1Sg`A5CrA]=hAeK1←GCi∀~∀@@@AC]dACe¬¬sfAo!K\AO¬aECO∀AG←Y1KGiS9N@@#M!β7πJβ' β&C∃βπ↔∪πeβ5+;∂SL{;Mβ∂∪∀4)α↓↓↓β≡33↔ ¬BεF}|W6/%∃`M&
~2εO4∞W≡.D∞π⊗N\≡&Ng∀λλO∀≥~→$
~<|∧∞}<⎇].h≥
!"H∧∧λλ≠M⎇9]→..]<≥∧];XnM9{H
≡h≥<n\;≠≡$∞⎇9YM≤z9;ND→[tD∞<y4N5Hλ∃m;H∩)i∩0R*D~<c!$λλλ∧∞Y<y.D≥≠h∧∂Y<[d∞~→(∧∞[⎇5
≥Y(∩)j∀Q3∧∧≤z≠n]→λ⊂⊃→P⊂1`[42rελ:7DaZ2quP→5y⊂⊂_w<FEλ⊂⊂⊂⊂→2v0|Yr⊂4w≥2y9:\:9P⊂≥t4qtλ6p|Pλ12P8→w24w→W⊂⊂⊂∪4πte that INHI@IT does not
prevEnp uncorrectable errors and control G oR contpcl X quiTq. Thqs, it
is pReferable To the jginterrupt f@U]GiS=\∪oQ∃\ASh↓SfAI∃cSeK⊂Ai↑@↓S]AS Sh~∀@@@AUgKdA%]iKeIkaif↓Ech@↓]←hAEkSiFQgkG @AgSQkCiS=]fACIJAeCIJ∪Kq
KahAαK9↓βd@4λα↓↓↓β≡{∪∃%p↓αS#*βGSπv#πK⊃π+Oπ∨*β?→β&C'Mβ≥;'S∂@∧εO≠!Q hP⊃∀ααα¬
¬-≤∧λeEα →dDL)~BHh!⊃∩αα∧¬¬≤-IyRβα →dDL)~BHh!⊃ααα∧¬brr∞∞&}≡↑:2π>≡Mαπ∂8Z"εNnLWπ↔↑
G4~;Z
≤X=→,DKCAQ@∧DPλ⊂⊂∀(∃i`%⊂∀⊂ gTRAL)
λ
∧@@A≥=iJAi!ChA∪9)%_↓oS@3bβ∪-βλ∧αE∧βtλλk∀λ∩)@ Bλ¬(R\~(~(Q)dM
Y~@h↓Hλλ∧∧∃~~.P9{t]1t⊂ )nhibits alhλAS]QKeE(επ'~≥f"π≤¬0∀≥9S⊂⊂∃42P ,e`
HAαCπ3→∧¬↔4→S`→λ⊂:y`% α b@2↓iQJA≥CeEC≥JAG↓x¬FF.>Mwαb≥f"ε⎇mGJπMRε>_∧XL≤βrP#olle@
aP∨IλJS#∃¬∪'>∞@εF∞β→C!⊂⊂⊂⊂λ0¬a@2↓EJAjMK@⊃β↔Iβ@.8XD∞≤[qn8εyP_<P:`3ijg (HLDOS 0 NNQP∪( Aa↑@β#@/⊗βH∀\⊂7w, a`≥↓ h ∩α∧∧αα∧α∪∪)P⊂_λ''hjRh∧ ∩∩β#5βSαXMdλ~0~λ10q`+ `∂M↓2q↓απ0εF/∩∧
∞↓y0∞I9@
β& ∧αε⊗≤8
a≥yQH∞M→#"D∧λλλ∞0∂utine CHAC@↔∩AgQ←β+3⊃β⊗)β∂πdc↔↓β&y↓β∂F+∂-β4{@∩α≥gJεLYF∂N\@λ∧
9]→.∞]<∃∞P7yεB⊂⊂⊂⊂λ8zt`4q" Thqs The standard usaga iS8
α
¬
Pace 4-67 ∪14-.7.4 March 6, 1979
(HLLOS 0 NOQUIT)
... process with NOQUIT non-zero ...
(HLLZS 0 NOQUIT)
(PUSHJ P CHECKI)
This is somewhat less useful than the user nointerrupt function, but was
implemented first. Note that the routine INTREL described above under
INHIBIT is equivalent to
(POP FXP INHIBIT)
(JRST 0 CHECKI)
and thus if for some reason one wants to pop the old value of INHIBIT
oneself, CHEAKI may be used instead of INTREL. CHECKI preserves all
accumulators.
(PUSHJ P UINITA)
This routine sets things up for opening a file, old I/O style. It takes a
file name list (name1 name2 dev user) in accumulAtor A, and on ITS a mode
in the right half oplied as for the uread function. In the dec-10
implementation, the device name is placed at location UTIN, and the ppn
in USN (the latter tag is not known to lap; beware!); the file names are
returned in T and TT. In the ITS implementation, the mode, device, and
file names are placed in a three-word block suitable for .OPEN at
location UTIN, and the lisp's sname is set to the appropriate user name.
The contents of accumulator A are preserved. UINITA also does the
equivalent of
(PUSH FXP INHIBIT)
(SETOM 0 INHIBIT)
thus locking out user interrupts, on the theory that some I/O operation
will take place which should not be interrupted. It is up to the caller
subsequently to unlock interrupts, e.g. by doing (JRST 0 INTREL).
Example:
on ITS, these functions provide a (relatively inefficient) method for
binary input (I/O channel 17, presently unused in pdp-10 lisp, is
usurped; beware, for this fact will change!):
March 6, 1979 ∪14-.7.4 Page 4-68
Maclisp ReferencE Manual
(LAP BINOPEN FSUBR)
(MOREI T 4) ;image unit input
(PUSHJ P UINITA) ;set up
(*OPEN 17 UTIN) ;try to open it
(LER3 0 (% SIXBIT BIN FILE NOT FOUND))
(JRST 0 INTREL) ;must unlock interrupts
(ENTRY BINGET SUBR)
(ARGS BINGET (NIL . 0))
(PUSH P (% 0 0 FIX1)) ;NCALLable!
(*IOT 17 TT) ;input a binary word
(POPJ P) ;return as a fixnum
(ENTRY BINCLOSE SUBR)
(ARGS BINCLOSE (NIL . 0))
(*CLOSE 17) ;close the channel
(POPJ P)
NIL
Page 4
69 ∪14%.7.4 March 6, 1979
4.5*5 The Multicq implemeNtation
α YS[ OV@%-%&A;u:~∀~(~∧h\\Xl@A⊃CiBAIKaeKMK]iCQS←\~(~∀4R↓↓α3N[∃β7␈≠Q↓αdJNCMbα7W3&K∂M↓∧jε∞∩M~AβK-βK↔O,sSM↓∧b&NAπ3π3W-→↓βπ~βC?'w#↔KMαβS 8Q)f⊗V\>G
∩∧ ⊗"πN⎇rπ6≥NV/~≡&*ε↑⊃Bπ&Tαπ'⎇tπε}≥nF/↔4∞ε}Nn@πεZ∞Mε*π<≥V*α
_F.wM≤6∞`Q(L-Y8u¬A"C"D∧λ⊂(∞
z;]↑H~4d∧_(~≥wV{w\2⊂2w≥4z4Wλ⊂⊂$zλ1ww9Zyz9P≠s⊂⊂0[⊂⊃4w→4y2q]⊂:7Pλ9rsvYw:εE≤0tp∩," which iS the principal pointer Op indirecT-word foRm provided by the
hardware, with some additional bits which specify the data-type od the object
pointed to. These bits are arranged so that all common type testing can be
done in a Single instruction.
Numerical values are represented somewhat differently. Since the pointer
is big enough to hold a machine fixnum or a machine flonum, these LISP data
types are not represented as objects in their own right. Instead, the machine
number is stored directly in the pointer. A special code is also stored in
the pointer which makes the hardware refuse to use it as a true pointer, i.e.
any attempt to indirect through a number-pointer will cause a fault.
The arrangement of bits in an ordinary pointer is:
--------------------------------------
| segment num |ring| type | tag |
--------------------------------------
| word num | 0 |
--------------------------------------
segment num and word num together make up the address of the object pointed
to. tag contains a magic value which informs the hardware that this is a
pointer. ring contains a ring-validation level which is of no concern to
lisp.
The arrangement of bits in a number "pointer" is:
March 6, 1979 ∪14-.7.5 Page 4-70
Maclisp Reference Manual
--------------------------------------
| 0 | type | tag |
--------------------------------------
| machine number |
--------------------------------------
Here tag is set to a different magic value, which informs the hardware that
this is not really a pointer.
The bits in the type field are:
Fixed this pointer contains a fixnum.
Float this pointer contains a flonum.
Atsym this pointer points at an atomic symbol.
String this pointer points at a string.
Subr this pointer points at an entry point to a machine-executable
function.
Bignum this pointer points at a bignum.
System←Subr pointer points at a subr built in to MACLISP. The Subr bit
this is also on.
Array this pointer points at the header of a lisp array. The Subr bit
is also on, because arrays are also functions.
File this pointer points at a file-object.
We can see that if any bit is on, the value is atomic. If no bits are
on,
i.e. the type field is zero, this is a pointer to a cons.
Now that we know what pointers look like, it is necessary to discuss what
the objects they point at look like. [OR, Having discussed the representation
of lisp values, now we will discuss the representation of lisp objects. ]
A consists of two values (or pointers), first the car and then the cdr.
The representation of fixnums and flonums has been discussed above.
Page 4-71 ∪14-.7.6 March 6, 1979
An atomic symbol consists of a structure which contains two pointers, the
length of the symbol's pname, and the pname itself. This structure is thus
variable in length, since there is no limit on the length of a pname. The two
pointers are the symbol's value cell and its property-list cell. The value
cell contains either all zero bits, if the symbol has no value, or the
symbol's lisp value. Since the value cell is the first item in an atomic
symbol, the value of a symbol can be referenced very quickly, by indirection.
The property-list cell contains the list of indicators and properties that
have been placed on the symbol. This list is nil when the symbol is first
created. The atomic symbol nil is an exception, however. Its property-list
cell is always nil in order to ensure that takiNg the cdr of nil always
returns nil. The actual property list is kept elsewhere.
A string is represented as a word containing its length, in characters,
followedby the characters themseLves, in the machine's string format of fkur
9- bit characters per word.
A bignum iq represeNted as a header word, with the sign in the left half
and the size In the right half. The sign iS 18 0-bits for a positive number,
or 18 1-bits for a negative number. The size is the number of words (machine
fixnums) required to represent the number. These words immediately follow the
header word. Each word contains 35 significant bits. The least significant
word is first.
The representation of a subr is a header word followed by the first
instruction of the subr. Normally this instruction calls a small subroutine
which saves the information about the caller that has to be saved [???] and
then transfers to the subr proper. This subroutine can be system-supplied or
generated by the compiler. In the case of some simple subrs, for instance eq,
the subr-object transfers directly to the subr proper.
The header word contains in its left half a specification of the number of
arguments requIred, and in its right half further information. In the case of
A compiledlisp subr, this is the relative address within the object segment
of the machine code for the subr. It is used by the linkage subroutine. The
right half is not used in a system subr. In the case of a subr (fixed number
of arguments), the left half is the number of arguments required. In the case
of an lsubr, it is the maximum number of argumeNts, in 9 bats, then the
minimum number of argumefts in the nexp 9 bits.
¬
The representation of an array iS a hea`er block which is pointed at by the
Lisp value. This header Block descRibes the array and points in turn to the
Actual array of values or machine numbers.
March 6, 1979 ∪14-.7.6 Page 4-72
Maclisp Reference Manual
The representation of a file is a large structure which contains all the
information required to access the file. This includes both information
needed by lisp, such as the eoffn, and information needed to access the file
in the outside world, such as a pointer to and pathname of a segment.
4.7.7 Environment, Stacks, Registers
The lisp environment is contained in several segments of storage. First
there are the object segments. These are read-only segments containing, for
the most part, executable machine code. There is one object segment for the
lisp system itself, another for the compiler, and another for library programs
such as grind. When a user's lisp functions are compiled, the compiler
produces another object segment.
There are "lisp.lists" segmefts, which contain list stpucture and oTher
lisp- objEct represEnpadions. Thes@∀AgKO5K]if↓CeJ@↓[CS]QCCMK⊂AErAQQJ@A≥CeEC≥J~¬G=YQKGQ←d\~(~∀@@↓)QKe∀ACeJAASg@]giCQSFDAl}}␈:↓cKO[∃]if\A)QKMJAG←9iC@'pβ∪πSλβ;?Q∧kπ;π>+⊃↓β↔H4+∨∂∪π∨*β∂?3f+∂S'|q1↓β¬∪';∂Oβπ33JβS#∃αβC↔C⊗+G.nL↔&N⎇n2ε↑d∧π∨...2αF,ZBαεmzBαπMPhVβ08m
;Y(=y→(
≡≤y3@∀V⊂ 4he Representations of arpays (but n`∨(↓iQJA∃YK[JαsQ↓β|04+SF)βπKα,↔O~α+λ≥Yλ⊂~~2P92\92yb[80`∀ions od∧AMRαc∃'|-&.∨N5`hPβ"H∧∧⊂;@≤α24`4ion There are Two "lisp.stackλAgKO5K]if8@A∂]∀ASfA
CYYKα!βC#(@⊗n∂-<V HαP @4ack, or @[¬`/⊗ ∧πε&ADε∞vDλ
(∪`:~2y4he uNmarked stacc _↓∧¬w$≥;[,≡X¬r@d pdl. Dhe
∃[¬`/⊗ ∧πε&@
∞P⊂⊃6Xy0E↓⊂@ β
β∀απ~⊃(↓pq10Yβ`
A↓_
vF@→0⊃@tor, he`≥εε)β@.8P ↓≡≠`→]4πre `iC@∩¬MC1c@↔
∧εF.O
pL≡X∧v 9,∧@A !J@Akαs'π↑+⊃βC&`'πM∧εVf↑ip
md≥≠h∧∞~→(py10Yβ`
@@α≠?33,∧7Mβy⊗εBαhe@]
JAkgα#⊃βSzβ@∨&|∧Y$αpq@(ine ta`→↓(∧G4≤⎇0⊃Z⊂0`∪ i`∪G↓_∧FF↓_;Y-}<h⊂↔≥vq2@2pε@1↓∧ε7.⊗-x
.M8π %
λ¬eKiU`rλλ9NY<`→YyP@ε#@&~βB5
(λ~≥tπ p⊃QfAβIJA←Lπ#↔ 2∧∞↓yp %↓⊂AC@:∧@λ∞βx8$d inA`↔m⊂≤m]KC"Hlπy⊂h¬YgiC9C@∃0∞fF.βH⊂⊂H30∃NBti`∨\αβ'Mα(
gε.,P ∧∧~0
pπCM↓(ε2εNL∧h∞2r ∃↓I\ACI⊃aKGf↓C]H↓Sif~)CC@3`∧G$βyP ,in`↔↓∞;∃βBx¬εw→<@⊂λ⊂9r@$ beL↓9h
%↓¬fbπMBαπYmV∂⊗αp∩@d pdl, anD pus@!Kf@Aβ≠77∀hS@&.β<↔≤αa`%↓Hβ←/K↑K;≥β≥βπ∂∃¬vw≠h:~2P -Ap¬WK↓ ∧πε&A`λ∧λ8
∪ arg@*εk↔+Sα4ε∂⊗Tλ-Ny`λ≥y]@∩↑p¬d
on the marhπ@↔⊂∞ε&∞h⊂~~2|@ !p¬JA`β+@≡↓→0∩ mj @EdA`∪"*βππM@ ∞↔
λ∧@@A¬`AiQ∀AEC_@N↑d
(≤`∩XπmeNT conTa`∪@:¬⊂L↓P:42Bzp∞@[¬`/⊗∧@λ∞≠∀≤β @Bαβ6OX ∧∧_0 2XF@
kNown @¬`
βSF)↓O&∂
αF+π&↑ D⊂⊂$@4 ic @Ma@∨K,∧Bπ~⊃ 9→P7w6≡P:7P~¬a`↔↓*β'Qβ0∧W.∧P %¬`∂e↓εFxhαX9NY<`→Kα @)!J@Afβ#π∂-αβ#↔π&+@∩αλ0Mnα0t`.pεβB↓mCESα#Ce↓∧¬f!8∧w3≠y0
Atiof tπQSGαA↓β&α1P@,\Y0_≥p¬`≥i1rAeKα3↔K↔v≠↔"-w&B/∩πελTεFO>∧π?<⎇→-∀_;Y∧↑(⊂⊃≠vx4@,e`λAXαK@∨α∧λ N↓w1z4[w9WεBαAd`&↓G←]i∃]afAαK;∂2(∧F+Pβ"C!⊂⊂⊂(≠pp∞tep¬fAi<AS@;&+@⊗↓X;λ
≥YSp→~pz4`/n stoped ⊃QgKo!KeJ\4⊂λ(αC"Jymbols t and nil,
with their AtsYm type-bits turned on.)
The in←pl1←code flag, which says whether execution is currently in the lisp
environment or the PL/I environment (see below).
Pointers to "operators," which are subroutines tk perform operations very
frequently required by compiled code. These exist because they can have more
efficient calling sequences than the full general lisp calling sequence. Many
operators perform operations which are performed by special forms in
interpreted code. (Other special forms are compiled directly into machine
instructions.) The table of pointers to operators is required so that
compiled code doesn't havE to be "linked" to the operators when it is load'ed.
This would be time- consuming and might prevent sharing of compiled object
segments. The operators are described in more detail below.
[Registers]
4.7.8 Calling Sequences
[ TO BE SUPPLIED ]
4.7.9 Operators
¬
[ EXPAND FROI THIS LIST ]
bind unbind errset1 errset2 Unerrset call catch1 catch2 uncatch iogbind
unseen go tag throw1 throw2 signp return err cons ncons xcons begin←list
append←list terminate←list compare link
March 6, 1979 ∪14%.7,7 Page 4-74
I. Glossary
a-list pointer
An a-list pointer is a number which can be passed as an extra
argument to eval or apply to indicate a particular
binding context in which variables will be evaluated. It is
similar to, but not the same as, a pdl pointer. An a-list
pointer may also be nil , which indicates the global or "top
level" binding context. The name "a-list pointer" is of
historical meaning only.
abbreviation
Abbreviation is a feature which allows large lists to be
truncated when printed out. See section 13.7.
alarmclock
A facility by which the user can specify a function to be called
after a specified amount Od time has elApsed. "Time" may be
measured as real elapsed time or as CPU run time.
¬
αaltmode
A c@!CeCGQKdAkMKHAS8@AiQ∀AaI`4b`AS5aYK[∃]iCi%←\A←α1α6ε≤b&NAr↓απ3≡x4)↓α↓↓β∂∞c3↔⊃ε+G∂π∧∧Rε␈$
π⊗.m∨α`h!Q hPQ(λ.∞≠~8l≡~;{AQHλλ∧∧⊂<≤
M8x=
≥{H⊂m⎇\z4nNhλ≠l@⊂⊂⊃0\86<t[3Q⊂0H⊂3:w_z4wgλ⊂:7P_P⊂6$\z⊂⊂'Yα
α areume@9ifAC9H@A← iCC]%]NAi!J@Am¬YcJA=H ↓β&C∃β≠,s∂S'}q↓β≠xε O&
z6(h$∧ααα≡& >990↔≥9S⊂⊂⊂x86 )catiOn iS explai`≥Jα!↓β'p∧ε&/L≥⊗bα
→bε≡≡π&/$∧β~pQ$ααα∧6%Hλ→.l9⊃8.M;{CAQ@εE⊂λ⊂⊂εEβA0y3]vrw:βA⊂⊂⊂λ⊂ w⊂_y3`∃@5K]h@αK@~ε≥`ε}⊗,X7απ⎇
⊗≡B
~2ε>≡lFrπMtε
εnYf∨&≥ybπεtn<X=Q ¬⊂⊂λ⊂⊂7g⊂⊂ !p¬`∪←_@AiQ∀@Aae=G@↔O~β? ↓∧∧W6∞β⊂~p]4p∞GABAα{@⊗(λ⊂⊃[w9t@3ts O`∧∩(α↓↓↓β&+@⊗Om⊂LP0`2gumentpεAMe=ZAiQ∀AMO⊗i1β←FK∂!αLε2εW↑8
∧(⊂⊗)pπhA↑α1β'S,¬W4β
For EaC[aXα!1↓β>C↔9↓¬##∃↓∧∧f␈⊗β(λ¬XπwPλ→P∀ λ'πMαβ↔[πe+πS⊗∧@λ∧∞~⊃#!⊂⊂⊂⊂λ0p∩gum`@;'→β@&t
(⊃@:[1z4`/n fO8@AC⊗)↓↓Mαβπ;⊂α↓Q↓aQ h↓@εE!pithmetic
λ~¬βAaS@0β⊃@∩b∧&&@X¬∩∩$@A∂Yα{@∨≡_↑!⊂(λλ∧∧λλ∀≤βrP)
λ ↓ MaclicP Ref@∃`↔~_R∧n≥nV∞`Q!PBα∧∧α∧l_9DM≥∧∧ε≡}nL⊗Nw4λg∞v>M⊗}w4
FzπXL@1y6@λ0y4`4hhKi%FA←aα+@⊗∞M_mnh≠sAQHλλ∧∧~;]\βry9H4πf @¬aE@''∪πKe∧ε6OVT∧ε∞v@λMd→S↔Xz4w3Kx7tg≥⊂7:vX2y0∪ with↓B~∧@@A`β∪↔∂'α=ε}p≥xbε∞-zW"εY⊂ m∞α9→,=8ε`vλ860qYyP∞ Sae @
QCAi∃`@@@8β⊗|H⊂⊂CE⊂⊂⊂λ⊂24iXzyy`)on o_AaQJβ≠∃β≠,¬f∨&≥xNUαEεBα
+∂∪@⊗∂⊃Q"αα∧∧∧∞r∧λλ.∞X:(
≡h_;D
βy22\αed pπ@↔⊂∧¬f $_q ⊗~9S⊂⊂⊂pqdλ1rf, iai contain A
λ∧@@@A→β'@A@∨T∧V∨"d∧α¬&Tεv∞β0∩Pλ0πf @QQJ@Aα@↔⊗_ε(
≡`8;∞wP:4→P⊂70Zp¬ O↓_@AC\4⊂ ↓↓α↓βπ∞∧0 .ytw3H32g!≥4p∂nA`∨#H&Bπ⎇λVrαλ⎇↔6.dn\Xp`→~x:0∪ ac arg@*εk↔;∪α5@H↓Hλλ∧∧≤Y0~≤¬r`≥fA`∪"*βπ?≠&+;@'4∧ε}H≥~Tλ_`∩~0∧ s@∃QKGi∃H@A¬dA`∪"*β@∨.(∧`⊃≤αipts,∧∀ λλ∧∧λ⊂
4→P3:`.atio@8@Agi=`∃↓∧¬V∂Jλ,Rπ8p∩`$ po¬`∂O≤⎇bπX;⊂~YyP:7H8∧he c`@3`ε0hR∧∧ααε|dε∞r∧λ↔.X8Wλ⊂ ISP a@%ICsfAαC∃β_¬⊗n∞β_<D∧≥≠hλitU∧H→β⊂ y≤αays excE↓A`∀ ∧ααα∞Mε∂"∞Mε*α∞8
,.x|Z.∞α9P "ec`∪\αβπA↓αβ';∂&+π"
p→D∧λ ⊗_u24hey@¬`∃α¬Yw, εE⊂λ⊂⊂⊂'eneral be@
CkG
↓aQJAα{∂∂W∧∧⊗w≤hλ
|β⊂:4→P9r`6eral c`@3`ε2εV\P ∧β0∂@hαβπ30hQ↓↓↓αβ∃αxbπεTπ<8εrP≤8x2WβE
∃CFα≠'∧Q$ααα∧∧&∂≡9⊂~$⊂⊂$@3 the↓Amep¬SGC8@@Aεβ#π+∪∂∪⊃↓α_¬f&*∧∧ε,βy⊂⊂λ p∞@Lαs@⊗↓89~-⎇A"@∧∧λλ∩-nα2y1Z0p∞Ge(∧@A&C'M↓¬↔4λ≥~T_p∀ \αactep∧@Aεαs∪∃β(ε6.λλ∀[8∧ernallY by
MACLISP ≤~(∩(Q!P@,8 y`(`π]K
εs@(α@⊂⊂λ⊂⊂ @ va`→↓(∧Bε80Pλ12P !pπgCO9K@⊃β&yβ¬β0∧↔-88[T~;B∞Nβw@ways 4bRA¬dA`↔∞¬_LF@
the F↓U]GiSα{9↓↓∧ε6/π∀¬Bαπ⎇
ε∞Bλ
0→H⊂9d`-iha@$!a@≥↓∧εFF*∧λλ.ypsw~p¬`≥h4⊂ ↓↓α↓βOS∂#↔'↔u!β'dλm⎇9(↔≤42y ` C]≥kCOKβ→1βπt!βeεFF*∞,VF∞¬→0∩λ32g!≥4p∂nS
α s∃`⊃↓↓∧⊗v"∧λ,≤¬zw!≠zp∞DP_%IJβE↓α∪'hM⊗v:β⊃ accO↓5a@∪&α0~\α⊂!<CA⊂⊂⊂λ⊂⊂&!ibdaX∪ae=@
↓@λ7≤α Do . Bijdi@9@
β'~β¬β3|∧6∞Bλ≡7<∧sw6Yu:↔εBα WhE8AG←]Q`}@∧ε@L80dpεAiQ∀AMK↓t∪C'⎇`λ∞]~8p∀λ⊂1`z\β`Hβ##∃α⊗K;∪'v91βSF(4R∧∧ααπh≥G∞(λ↔Xε the p
CE%CE@3*β'Lεα,W>≠p 2Y⊂:7P≥p0`4↓Sh@@β;πMβ∞&N←$
T≥~⊃!P¬⊂⊂⊂λ⊂14@.di`≥↓8¬`H⊂β"C!⊂⊂⊂⊂α@
a@&π≠?∂π∂#'?9¬FO∨AQ"αα∧∧∧∞Rλλ<nwq`)↓¬iS@?p∧αε~0`~λ4yP ! ` S_∞BεyH⊂∩≠z:2`$ paip¬f@0
v.α2`.↓`↔O⊗∧@λ∞|=~β!⊂⊂⊂⊂λ842P_εp@:∧0
≥y\h∧∧_0 @soc , acs@@@X@@↓cCggα{¬↓@_-lλλλ∞pyy`0 .~∀@@@A→←d@Aα+cπ↑ F*B∧¬αF
¬`λεE(λ
$→[`7H_TP∀≡⊂⊂↔≡TTP⊂_yyg`#iate@L@AB4⊂@@@AgSi @@h0∪D@Aβ;'C!α↓#≠⎇tβ
J¬Dε∞vA⊂∞∧∧≥z5
∧λ≡(¬@αAεEβ@
~∃αS/4hP4
C∞;∃β'H@$$⊂λvf←>8↔πλα λ∧∧λλλλ≡≤Z3∧εMKλε⊗-m#!↓A"""$λ{≠tn<<Z(∧∧λβ"AP¬⊂⊂⊂λ⊂ wλ0z7fH4yP⊂_P⊂&$Th⊂⊂'X52qjλ⊂;t4Xt⊂⊂$\β usually pho@UKQh@↓←D@A¬f~∀@@@AS9ISmSβ≠'∪*q↓↓α∂#?7M∧≠?7∀LC9βO-3↔Kπb↓βSG∧+@≠∩∧fOFn]W~bh
⎇];<eA @λ∧∧λ_Z,]];<eD≤⎇≤M≥Y|k∧9Q⊂_z7vtXP9|fX7v9WβE
αatomic symboL
Anatomic symbol Is a @QsaJ@↓←LACQ←ZAo!SGPA!Cf@A∧Aa]C5JXAB↓mCYk∀~∀@@@AGK1XX@A¬]HAB↓ae←a∃aibA1Sgh\@AαAA]C[J↓SfABAgie%]NA←_AGQCICGiKIb~∀@@@Ao!SGPA%IK]i%MrAi!JAgs5E←X\@AαAYCYkJ↓GKYXipulation.
autoload
The autoload feature allows the definitions of functions not
initially present in the environment to be loaded in from a file
automatically when they are required. It is used in the
implementation of special utility packages, such as trace,
grind, and large application systems.
backtrace
A display of pending evaluations, which can be used in debugging
to determine the chain of calls leading to the point of error.
The function baktrace prints this out.
base
The value of the variable base is the radix in which the
output routines represent numbers. It is initially 8.
bignum
A bignum is an integer of arbitrarily large magnitude. The
arithmetic functions pLus, Times, difference, etc. use
bignums where necessary and automaticalhq manage the varying
storace required. For exaeple, bignums make the computation of
1000 factorial easy to write* Becau@MJ@A←_AiQSL∪a←o∃d@AE%O]kZ4∀@@@ACeSQQ[Ki%FASf↓]←iS
KCEYdAgY←]KdAi!C\AM%qUkZ↓CeCi![KiSX∩∀~)βaeS0@dlXbrnj$∩∩@A≥Y←gg¬er∩∩@@@AACOJA%SR~∀_∩∩∩@@A≠¬GYSg@A%KM∃aK]Gα)α7πw+π04Ph)↓↓α4(∀T∪';π↔IβCK};Kπ∃π≠Cπ∂(h)↓↓α↓α'→αβS#∃πβ∪A5↓β'7εc↔7↔w#πS'}q↓β?2α6ε∞dJNA1∧⊗rε≡,V
α
xbεn]]wπ
→`hR∧∧ααπ⎇
⊗≡B≡'ε∂≡4ε∞vDλ6}o
_\λ→U-l⎇~;mnh_<LT≤⎇≠n,9C!! Hλ∧∧β"C!X∧w2~w3FEλ⊂⊂⊂⊂⊂P;0y~pq62H⊂6p|H12P⊃_7zw2λ⊂:7P_P;0v≥p¬ by us@∀AWL@↓YCKE⊃BPAaI←NX~(@@@@A←d@↓IV@\%)QJAYCYkJAWLAQQJAm¬eSCE1JASf↓cKhAQK[a←β∪πK'eI1β,ε@hR∧∧ααπ⎇≥FBε,Tαπ⊗↑:F␈⊗\Dπ&@hλ≥
(≤≤L↑X;⎇.∀λ≥X-N9(∃m;Hλ∞M→(≥L≡X88ML(λ~.1"Hλ∧∧λλ]-l[y;LEHHλ∧
;XZ-l~;Yd
_<_→w9P⊂≥t2wλ:42D→4πrm thad bgEnd the
α vapiable iS exited, wheTher @9←eKC1YrX@↓Er@A¬\@AKIeWdXA←d@↓Er
∀@@@@↓iQe←\@\4R↓↓↓hP4Ns∪'≠8∧ε≡}nLWGβ"H∧∧λλ∃
(λ⊂M≥Y~3LTλ_p↔[82|:λ⊂1wG≤tqz9H⊂7s⊂λ:42Pλ90v:YyP⊂7Xα alh boUnd
var`∪C YKf\α↓α6ε≤b&NAαβ';∂e+∪↔M∧∧∩απ≡'&N≥Dε∞⊗≥I↔'J∧
Fzα
\⊗vO∞]F∂&QQ"αα∧∧ε⊗NlM⊗v:9vwε←∞G
α=~Tλ_ ⊗[4yzλ87tg≥2y⊂ &acilIty, Which a`→Y=of~∀@@@A S]IS9J@AG=]iKqQbAi↑AEJ@↓kgKλACf@↓Y@∨;8βπM↓∧∧6}wN-vbα
≡2αεl↑7&.AQ"αα∧∧π∞}\ZvF/,Tπ>OM
⊗rπMVjPQ!P@H!Q$⊗{{⊃,≥H≠p_→y0z4[w9FEλ⊂⊂⊂⊂∪`af$Th⊂4g_v:r2\P0P&ull q`hAα{⊃α|{#↔πpβ?C↔⊗S'?w→β?9ε∪'SMp↓αS#(h)↓↓α↓↓MYp↓βεαN0O>
_6Bε\≥6*α∞↑αε
∧λfOFn]Rεn∨∀αε⊗T
wε/,≡F."∧ vrε/∀απ&QPRα∧∧ααε-yvf*∧∧ε7∞l:FN}e`α¬&Tαα⊗≥lBb∩∧-wαb$λ⊗v ∀-f␈"$
wε/,≡FN}n4ε}pQ$ααα∧
F}>≤<⊗bπl≥G.<hλ≡Y(_-N{h~-l{≥9\ ≥m≡~λλ∧∞λλ≤nL8π24[3P37\⊂:9:YFA⊂⊂λ⊂⊂0w→⊂⊂74[⊂⊂37\⊂30v≤p¬. A variety of predicate functions, which
retqrf a true or fadcE i.e* t op∧@A]%X@B@↓mCIJα)1↓β∂∪∀4)α↓↓↓βH¬f≡g\LV"pQ!PRα∧∧hPQ(λM};Y⊂≥0y4pX62FEλ⊂⊂⊂⊂⊂Dq7j[2⊂;0\4pq6→Dp `&↓C\ACQ←[SFAgc[ ←XAo!←gJ@↓GkeE∃]hAm¬Y`↔∃π;πL4R↓↓↓↓εGO'>s↔⊃↓¬#=β'"βeβn+π;Mαβ?→βλ∧ε⊗NlM⊗v:d∧∧O"∧
↔4≤{s,↑~~3LT≠~:lT_#"D∧λλλ
Lβqpvλ;0y4Xq22WβE
αbreac l@∃mKX~(@@@@↓α∪IKYKXA←_@AG↑αsSK∨bβπQ↓π;#'∂@β∂?7π+Sπ∪L{9↓βFMβ,+9βS.kC?K∂∪'3dhQ↓↓↓αβOWOε+;∪↔ Keβλ↓βK,/C?NsQ↓↓G ;I9Ja↓βπfc?←'v9βSgε+'9↓ε3@⊗}T∧π&FQQ hU≤v*ε≡a⊂HH∀λvf←><↔↔H∀∧ααα∧∧∧∂π-≥Bβ∪eDβvQP@`H⊃⊃∩∧>M}7≡∂/∀ααα↓Q h∩∧∧ααε=yg≡}LUbαε<ebαα∞Mwαα
HW6.EDπ>F↑,PO'≡λ -≥B:<d;≠≠n|9λλNY{(∧∞~→#!$λλλ∧{{\m⎇→(_L\x=4lT≠[h={<≥.L=~3md~<h
≥H≤≤M||Y<n5C"C!$λλλ↓QC"XN,8:|
⎇;]β!$λλλ∧λ(_\L\:|≠m≥]λλ
≡hλ_$∧≤≠z-nλ~;D∧_(λ∞∞[y|L≥(≥z↑Y(λ={<≥.L=~;mdλ~<aQHλλ∧∧≥→;.
|X<M≥≡(λ∞><|→-l→9λ≥Yλλ={]≤M⎇λ~<d∞Y=≥.-Y9λ∧∞≠h≥
(_{mn{{→%A"Hλ∧∧λ→;L≤[~;Lt≥~→$∞<y<D∞≠h→/∞≠≠|LT≥~→$∞⎇_=T≠yH∞M→(_m⎇<≥=≡~;{Edλ∪;n>β"H∧∧λλ→..[|\dx=<lT_(_N,8:|
⎇;]∧;Yλ∞M→(≥∞,8y(l8z;
≡≡(_l≥H_Y$∞<y9∧∞≠c"D∧λλλ
≥\y<ND_\Y,≥|≠z-n≤kH∧∧⊂(λ∞↑y<H<;B;,≥y(λ∀_\Y,≥|≠z-nλλ≥m≡~λλ∞M→#"D∧λλλn;X⎇
≥{Hλ.Y8:d¬C"C!$λλλ↓QC"Xl≡C"H∧∧λλ∃
(→Z..⎇α;,]8Y<D
yH_$≠⎇≥\λ≤_-≡H≠|D∧_(≠
≡⎇H∧
~→(
l;9(L<Z=L↑c"H∧∧λλ→N-{(λλ={]→-n≤h≠ld⊂9→∞,<|b*,9z<nL<H≠md≥~→$ 0S(∧εl∞-¬D≥z→.,(∪∩*:β"H∧∧λλ≥l≡h→Z..⎇λ~-↑≠→;,]]→9¬a"C"D∧λλβ!!"Xx.Lzλ≥≤c"H∧∧λλ⊂-d≠xZL\⎇λ≥m
8zλ
≡h≥<l\λ≥≠d∞Y;_.L"=~∞-⎇h n4_;Y∧∧_x==λ y.5C"C!$λλλ↓QC"XlNC"H∧∧λλ∃
(λ≤l\{{Y∧
9;8L↑Hλ≠ld_(λM⎇≥→,D≤_:.%λ≠|A≡~→(∧.Y<⎇∧$λ≠yD(≠~.>β"H∧∧λλ
∃Y+H∧∧_;≠∧
9;8L↑\hλ←_y<∞D≥~→$∧→Z<N>J(∧
~→(∧
X;9$→<Z.l<h→N
{#"D∧λλλλ={]→-n≤h≠l@⊂⊂"2Xy2vr[:⊂)2Ytyz2\⊂7w⊂≥42P$P&P⊂≠L≤Z⊗⊂≥t2y2H&$ihλ;pp∪
first implemented.
character
One of the 1∩8. ASCII characterq. On a Typewriter a character
is represeNted By a printed mark or by a foRmatting operation
such As a Backspace. InterfAllq achaBacter iay Be rePrese@9iKH~(@@@@↓CfAB↓]kKE∃`XAo!SGPA%`
βSF('πO≤¬⊗Jε=p T→Sp→λ:42P_t0a0Xz2yελ7y⊂ \P0FEλ⊂⊂⊂⊂_t0a0Xz2y⊂≠q52q]⊂∀8W≥↔∀W⊂λ!t0y_qz2y≤P0q2H0r ∪O use@⊂AS\AA]C[LACMH4∀@@@AS\AMieS]≥f\
∀4∀@@@~∧
∃
QCeC
iKdA=EUKGP~∧@@@Aβ\ACi←5SF@AMs[E←0@AoQ%GP∪ge[E←Y%uKf@↓B@AG!CeCGQKd\@A)QJA]kY0~∀
∃¬aeSXdlX@Drnj∩$∩@A∂1←ggCIr∩α@@@@@↓!COJ↓l~∀_∩∩∩@@A≠¬GYSg@A%KM∃aK]Fα)α7πw+π04Ph)↓↓α↓β∂#∂∪π∂S/⊃β'MαβOg7⊗{3'k.!βeπ##∃β∂#?7'~βGg7⊗{1↓β>C?O∃πβ;π7*β'Mβ|04)↓α↓↓βk/∪=↓βf+;∨SCYβ↔π≡Aβ?→αβS#∃ε{S#↔∩β∂#ε⊗∂S↔↔→β'MαβOg7⊗{3'k.!βe∧84)α↓↓↓β∂#?7'~βOg7⊗{1β←F{O∃βεsπ7∃εKEβSFQβ∂FKπ∂&+I84Ph)↓↓α4(4T≠#πK∞≠S↔I¬#Cπ;≡cπS'}p4)↓α↓↓α¬∧3↔πS,ε&*ε≥dπ&FT∞&.∞L↑"π>
_6Bε≥IF␈?46F∂,≤7&/.4π&h_Y$∞≤X;N=_9→,A Hλ∧∧λ≥≠d
⎇~→.∧_z_.,8⎇→..h≥z]Hλ≥
>(_.,(≤Y,≤α⊂4w⊂⊂#7\α example, pd`-10
MACLISP usepε@Ai!SfALα+πSW⊗)↓βSzβSKπw≠3π∪*↓β3?>+A7∂∂≠∃β3-#C↔K~↓βS<hQ↓↓↓αβWCC-⊃7∂π≤∧R`h$∧ααQ!PV≡≡'ε␈1Q"αα∧∧¬&FT∧εw.\,W∩α
xbαα=ε∂⊗≤:F/∩∧∞ε␈≡≡M⊗}w4∧ε7⊗⎇Tαπ&Q⊗f.nDαεn≡,vNraQ"αα∧∧∧&/<8M≤Y<h∞M→(≤
}z=~-⎇H≠p∪αz42P≥<x4`.g elEma`≥h↓←\ABαβSgC-;C'S/⊃β?HhQ↓↓↓αβS#∃ε≠WK∂⎇⊃↓β?pβ¬β∪O≠C#εβ∃`M&Tεv␈L≡FN}d
↔4λ→6∞L9Y→,D≥≠hM;→4d
{C"D∧λλλ≥↑(⊃↑pos. It is the number of
character positions from the right margin.
closing a file
Some operating systems require a "cleaning up" operation after
all use of a file has been completed. This is called closing
the file. The MACLISP garbage collector will usually do this
automatically.
comment
Comments are descriptive text, not interpreted by the LISP
system, which are inserted into programs for the edification of
a reader of that program. In MACLISP there is a comment
function, which does nothing with its arguments and so may be
used for comments, but a better way to write comments is with
the semicolon macro character, which makes everything from it to
the end of the line a comment. For example,
(foo (bar x)) ;whizzo the frammis.
Page vi Glossary April 26, 1975
Glossary
compilation
Compilation is a process which can be applied to a MACLISP
function to make it run faster. The cost of compilation is that
debugging is made more difficult. Generally debugging is done
by interpretation (q.v.)
cons
A cons, also called a dotted pair, is the basic unit for the
construction of data structures in MACLISP. A cons contains two
members, the car and the cdr, which can be any objects
whatsoever.
control characters
Control characters are used to tell the MACLISP system to
perform some action immediately, no matter what it is currently
doing. See section 12.3.
correctable errors
Most errors in MACLISP are correctable. This means that they
cause a user interrupt, which either invokes a user-specified
function to correct the error, or causes a breakpoint, which
allows the user to determine how to correct it, inform MACLISP
of the correction, and continue the interrupted computation.
cross reference
The "index" package may be used to produce "cross references" of
LISP programs. See chapter 17.
data types
In MACLISP, objects come in several types, which are explained
in chapter 2.
declaration
Declarations are used to give the compiler extra information,
not needed by the interpreter, which clarifies the programmer's
April 26, 1975 Glossary Page vii
Maclisp Reference Manual
intent and makes possible the compilation of more efficient
code. The function declare is provided for this purpose.
debugging
Debugging is the usually long and painful process of finding
mistakes (bugs) in programs and removing them* MACLISP provides
a number of tools to assist in debugging. See errors, user
interrupts, baktrace, breakpoints, trace, the *rset switch,
and interpretation.
display slave
The "display slave" Iq part of the Moby I/K facility in MACLISP.
When the pdp-10 implementation of MACLISP is running on the MIT
A.I. Lab pdp-10, the display slave may be used tk display text
and graphics. ExtensiOn of the display slave to other sites and
implementations is anticipated.
do loop
A clear And concise notation for iterative algorithms, provided
by the do function iN MACLISP.
dot notation
A notation in which a Dotted pair is written with parentheses
and a period. A dotted pair whose car is a and whose cdr is b
is written:
(a . b)
Any structure of dotted pairs can be written unambiguously, but
not necessarily clearly, this way:
(((a . b) . c) . (d . e))
dotted list
A structure which would be a list except that it doeq not end in
nil. It is written in a hybrid of dot notation and list
notation. For example:
(a . (b . c))
Page viii Glossary April 26, 1975
Glossary
would be written:
(a b . c)
dotted pair
See Cons.
edit
The pdp-10 implEme`≥i¬iS←\↓←L@A1∪' @↓G←]i¬S]f@↓C\@AL[KqaIKggSα{84)α↓↓↓β.#'S?∩aβ∪↔≡≠C'. ''9∧≠#πC&+I↓↓A1↓α&C∃↓αo+3S'∨→↓β'oβ3↔7.sSπSL{84)α↓↓↓β&{↔M↓εs?Qβπ∪↔O↔w#3e↓εCπ[∀N ↓β,¬⊗gαβ:;D9~=
}Kλλ
⎇y=L↑Hλ≤l↑Y<X-A ¬⊂⊂λ⊂⊂2r~z7y9K⊂;y4]82w~w⊂&$Th⊗⊂ %xist.
¬
¬
End-oF-file
When an input file is being pead, eveNtually it comes to The e@9H~∧@@@AC9HAg←5J@AgAKGSC0ACGi%←\A[¬rAQCYJAi↑AEJAAKeM←I[CH\A'KJ↓gKGi%←\~∀@@@@Df\d\P\~∀~(@@@@4∀~∃K9IaCO∃M\~∀@@@A∧AMk]
iS←\0@ACgβ≠?∂'∂#↔⊃β>KS!β.∂!β␈+SCW"↓β≠'f)1β←FK∂!βO→β';6{/↔⊂hQ↓↓↓αβ←#↔v+[↔I∧ β;↔:βCπ∨*β?→β␈+SCW"β'Mβ∨#πKS.!84(hQ↓↓↓h(4+.s['K}s7↔; h)↓↓α↓α∧&dJNAβ.s['K}s7↔;"↓β∂?w≠'OS~↓β?_N β∂?oβ3↔S*↓βO↔"↓β?→αβ?+.≠SM0hQ↓↓↓αβ[πKN3∃π3π3W/→1β≠.s∂S'}qβ∪↔4K;'SN{;M1∧;⊃β6K3↔Mbβ←#'≡AβS?>+S#↔⊂h)↓↓α↓β7π↑)βWAε9βππβ3'∂∂#'?9π≠gOS.iβ?I∧ βWO/⊃∨Mβ∨+KK↔w!β←?⊗Y9↓α≡+∂S'}p4)↓α↓↓↓E∩qa9Mε#↔O∂⊗K↔Mπ;πgMπ#=↓β≡[∃β&C∃β∂/∪K↔;"β↔;[M∪?;7.sQβπv!β3π&+H4)α↓↓↓β⊗+OW7*β←?K↑K;≥β>KS!βO!84(hQ↓↓↓h(4+.{≠≠8hQ↓↓↓αα∧'≠.s∂S'}q1βπ≥≠?∂'∂#↔⊃β>KS!↓ε+π∂!εK;CW"β∪'3*a↓β←FK∂!βO→β';6{/↔⊂hQ↓↓↓αβ←#↔rβπ9β∂#S↔7π!β'Mεkπ∪∃π#=↓β⊗+π↓βεOQβ&C∃β↔v!β?→π##∃β&S¬βL¬bπ&QPRα∧∧αε6≥LRph!Q hR∧∧αh(≡π⊗NDε#2bε↔∪;(⊃⊃∩α∧⎇Mw>x<↑!⊃(λλ∧∧λ∀_,|(~6↓Q@↓A""(∧∧λ∪8,=~<|∧
Y9Q.;Xy$ 8;],≥β"C!,<#"D∧λλλ∧<(λ∧
<h_$];XnM;{H∧[|H={<_.-;Yh∞N{hλ
|ZY8nNkλ≥m
8zλ∞,=≥<Mnc"H∧∧λλλ∞Dλ~9D∞~→>$<Y(={<≠↑tical, nil if they are not.
(In machine terms, completely identical means they have the same
storage address.) eq is not defined for numbers and
strings. cf. equal .
equal
equal is a function for comparing two objects, which returns
t if they are similar, nil if they are not. Similar
means approximately that they would look the same if printed
out. equal works for numbers and strings: numbers are
equal if their values are numerically equal, strings are
equal if they contain the same characters. Atomic symbols
are equal if they are eq . Two dotted pairs are
equal if their cars are equal and their cdrs are
equal .
errors
Handling of errors in MACLISP is very flexible, in recognition
of the fact that errors are a major tool in debugging. See
section 12.4.
escape
See altmode.
evaluation
The process by which a form, which may be almost any LISP
object, is made to produce a value. Evaluation may involve
taking the values of variables and applying functions when a
function call is indicated by a list as a form. Evaluation is
explained in detail in chapter 3.
expr
An expr is an interpreted function which takes a specific number
of evaluated arguments.
Page x Glossary April 26, 1975
Glossary
fail-act
A catch-all category of errors, which cause a breakpoint to
occur. The atom args is bound to useful information about
the error.
fexpr
An interpreted function which implements a special form. It
does not receive the regular type of evaluated arguments.
file
A sequence of characters in the external world, and also an
object within the lisp environment which is used to communicate
with that sequence of characters. See chapter 13.
file name defaults
There is a system of defaults for file names which is intended
to increase the convenience of users and programmers. See
chapter 13.
file object
An object within the LISP environment which symbolizes a file in
the outside world. See file.
fixnum
A fixnum is a type of number, specifically an integer whose
absolute value is less than some machine-dependent maximum. In
the pdp-10 and Multics implementations, this maximum is 2**35-1,
or 34359738367. Compiled code can perform fixnum arithmetic
very efficiently.
flonum
A flonum is a type of number, specifically a floating-point
number, similar to REAL in FORTRAN, which has machine-dependent
range and precision. In the Multics and pdp-10 implementations
the range is about 10**-38 to 10**38 and the precision is about
8 decimal digits.
April 26, 1975 Glossary Page xi
Maclisp Reference Manual
flow of control
The logical sequence in which parts of a program are executed.
This includes decision, recursion, iteration, and function
calling. In LISP flow of control is generally linear except as
otherwise specified, except that the use of functional
composition causes the arguments to a function to be evaluated
before the function. The functions cond, and, or, do, prog,
go, throw, and return are among those functions used for
their effect on the flow of control.
form
A form is an S-expression which is intended to be evaluated. It
may be an atomic symbol, an atom such as a string or a number
which evaluates to itself, or a list of forms, the first of
which is a functional form and the rest of which are argument
forms.
formatting
The grind package may be used for the formatted printing of LISP
functions or data. See chapter 16.
free storage
In the pdp-10 implementation of MACLISP, free storage is that
part of memory set aside for various types of LISP data objects.
In some versions the size of this area must be specified when
LISP is first entered. The free storage area is managed by a
garbage collection algorithm.
free variable
A free variable is an atomic symbol whose current value was not
determined by binding within the currently EvaluatingfuncTion.
Either it has a global value or it was bound in some function
which then cAlhed the current function.
fsubr
An fqubr is a machine-lafguage @→k]Gi%←\Ao!SGP∪%[aYK5K]ifAB~∀4∃!CO∀AqSR$∩∩A∂1←ggCIr∩@@@@@A¬aeSXdlX@Drnj~(_∩∩∩$A∂Y←MgCer@@@~(~∀@@@Aga∃GSCX↓M←eZ8@A/Q∃\ABA→KqadASfA
←[aS1KHASPAEKG=[KfA¬\AMgUEd\@↓α~∀@@@A]U[EKd↓←LAi!JAEk%YiS\↓Mk]GQS←]f0AgkG ACf@↓G←]HXACe∀AMgk ef\~(~∀~∀4∃Mk]¬eN~∀@@@A∧AMk]
iS←]¬XAM←IZXAa¬ggKH%CfAC8ACeOU[K]h↓kgkC1YrXA]QSGP↓GCee%Kf~∀@@@A]SiPA%h@AB↓a←S]QKdAi<AiQJ%ES]I%]NAG=]iKqPAS\A]QSGPAShA%fAi↑↓EJ~∀@@@A¬aaYS∃H\@AMKJAi!J∩UMU]GiS=\@AMU]GiS=\\~∀4∀@@@~∀~∃→k]Gi%←\~∀@@@A∧A→∪'@@A←E)KGhAMkSiC YJ@A→←dACAaYSG¬iS←\8∩A∂SYK\ACIOk[K9ifX@↓Sh~∀@@@AAKeM←I[fAg=[JACIESie¬erAG¬YGkY¬iS←\↓C]HAIKike9fAg←5JA→∪M A←E)KGh~(@@@@↓Cf@A∧@AmC1kJ\@@A
k9GiS←9f@ACIJ@Ai!J@AMU]IC[∃]iCX%G←]iI←X@@!C]H~(@@@@↓gs]i¬GiSF$AgieUGike∀AS\A1∪' \4∀~∀@@@~∀4∃Mk]
iS←]¬XAM←IZ~∀@@@Aβ9rA&[∃qaeKMgS←\AoQS
PAGC8@AEJ↓kgKHACfA∧@AMk9GiS←8\@@A!←oKm∃dX~∀@@@A=MiK\↓iQJ∪QKeZ@EMk]
iS←]¬XAM←IZD@A%fAeKMKemK for non-atomic
functions, such as lambda-expressions, labels, or random forms
which are evaluated to produce a function.
garbage collection
The basic memory management scheme of all LISP implementations.
Objects are retained until there are no references to them, at
which time since the object can never again be used the storage
it occupies can be reclaimed. Reclamation (garbage collection)
occurs periodically when the system decides it would be a good
thing to do.
gc-daemon
A user interrupt which occurs after each garbage collection,
allowing a user-specified function to gain control and monitor
the program or make decisions based on the efficiency of storage
usage of the program.
gensym
April 26, 1975 Glossary Page xiii
Maclisp Reference Manual
An atomic symbol which has a unique name of the form g0001,
g0002, etc. gensym 'ed atoms are not "interned," so they
cannot be referenced from the console. They are generated by
the function gensym .
global variable
A variable which does not currently have a local binding. Its
value is whatever value has been assigned to it in the global
binding context, for instance if it has been setq 'ed at top
level.
grind
A package for printing LISP functions and list structure in an
indented form that is easy to read. See chapter 16.
ibase
The value of the variable ibase is the radix in which
numbers read by the reader will be converted. It is initially
8.
index
A cross-referencing package for LISP programs. See chapter 17.
indicator
An atomic symbol (usually) which serves to label an item in a
property list.
input source
The file from which input is taken, when no source is specified.
Determined by the variable infile .
integer
Page xiv Glossary April 26, 1975
Glossary
A type of number which can be represented in MACLISP by either a
fixnum or a bignum, depending on how large it is.
intern
When an atomic symbol is read in, it is placed in a special
table called the obarray; this is called interning the atomic
symbol. The obarray allows the same (according to the function
eq ) atomic symbol to be used the next time the same pname is
read.
interpretation
A method for executing LISP programs in which S-expressions are
processed by an interpreting program without preliminary
translation. This is the usual mode for execution of lisp. It
is more efficient than compilation (q.v.) for evaluating once-
only expressions such as directly typed-in input, and for
debugging.
I/O
Input/Output, or communication between LISP programs and the
outside world. See chapter 13.
iteration
See do loop.
label
1) see prog tag.
2) a type of functional form.
lambda
lambda-expressions are the most common type of (non-atomic)
functional form. A lambda-expression is written as a list
(lambda ( <vars> ) <body> ) .
April 26, 1975 Glossary Page xv
Maclisp Reference Manual
lambda-variables
Variables bound in a lambda-expression are called lambda-
variables.
lexpr
An interpreted function which takes a variable number of
evaluated arguments. An expr with an atomic symbol in place of
the lambda-variables list is a lexpr.
linel
The number of character positions per line.
linenum
The line number, starting from 0 at the top of the page, of the
current input or output position in a file.
LISP
A language for list processing and manipulation of symbolic and
structured information. The MACLISP dialect of LISP is
described in this manual.
list
A data structure in LISP, composed of several conses. The car
of each cons is a member of the list, and the cdr of each cons
is the next cons, except that the cdr of the last cons is nil,
which marks the end of the list.
list notation
A more concise form than dot notation for writing lists. For
example,
(a . (b . (c . nil)))
is (a b c) in the list notation.
Page xvi Glossary April 26, 1975
Glossary
load
Loading is the process of bringing function definitions,
variable values, atomic symbol properties, etc. into the
current LISP environment from an outside source, such as a file.
See the load function.
looping
See do loop.
lsubr
An lsubr is a machine-language function which takes a variable
number of evaluated arguments. A compiled lexpr is an lsubr. A
number of the builtin functions, such as plus , are lsubrs.
macro
A type of function which produces as its value a form which is
then automatically evaluated to yield the final result of the
function call.
macro character
A macro character is a character which, when read, causes a
function to be invoked. Macro characters are used to implement
complicated special input syntax. The ' character is an example
of a macro character.
mapping
A type of iteration in which a function is applied to successive
parts of a list. See chapter 10.
moby I/O
A feature in some versions of the pdp-10 implementation of
MACLISP by which various peculiar hardware devices may be
manipulated by LISP programs.
April 26, 1975 Glossary Page xvii
Maclisp Reference Manual
namelist
A list of atomic symbols which specifies the name of a file in
the form of multiple components.
namestring
A character string which specifies the name of a file in
implementation-dependent format.
newio
The I/O system described in chapter 13. Some LISPs still use an
older I/O system which is less general, described in section
13.5.
newline
The character or sequence of characters used in the host
operating system to indicate the separation between lines.
nil
An atomic symbol which is used for expressing lies (cf. t .)
nil indicates "false," "default," or "end of list." nil
is a constant since its value is initially nil and cannot be
changed.
non-local exits
Escaping from nested function calls without going through the
normal function-return mechanism. See catch and throw .
number
See fixnum, flonum, bignum.
obarray
Page xviii Glossary April 26, 1975
Glossary
A table of interned atomic symbols, used by the reader to insure
that each time a pname is typed in it will refer to the same
(according to the function eq) atomic symbol.
object
Any piece of data used by LISP. Programs are also objects.
octal
The number system used by MACLISP, unless some other is
specified. Fixnums and bignums are converted for input and
output in octal (base 8). Note that flonums are always in
decimal.
opening a file
Creating a file object so that a file in the outside world is
usable by LISP.
output destinations
Those files to which output is sent if a destination is not
explicitly specified. The value od the variable outfiles is
a list of the output destinations.
pagel
The number of lines per page in a file.
pagenum
The current page number in a file, starting with 0 at the tima
it is opened.
pdl
Pqsh-down list or push-down stack. MACLISP uses several @AIYf~(@@@@↓S]iKI]CYYdAM←d↓ES]I%]NAC9HAeK
kegSYJAKm¬YkCi%←\\~(~∀~∃¬aeSXdlX@Drnj∩$∩@A∂1←ggCIr∩∩@@@A!¬OJAq%p~∀_∩∩∩@@A≠¬GYSg@A%KM∃eK]G∀A≠C]UCX~∀4∀@@@~∀~∃AIXA←YKeMY=n~∀@@@A!⊃XA←m∃eMY←\@ASf↓oQCh↓QCaa∃]fAo!K\AB↓IKai @A←L↓eKGkIgS←\↓SfAkMKH~∀@@@AQQChA%f@A[=eJAi!C\Ai!JAS[AYK[K9iCiS=\@AG¬\AQC9IYJ\A∪hA≥K]Ke¬YYr~(@@@@↓S]IS
CiKf↓C\AKIe←d\4∀~∀@@@~∀4∃aIX↓a←S]QKd~∀@@@A∧AMSq9kZ@A]QSGP↓S]IS
CiKf%B@Aa¬eiSGUYCdAA←S]hAS\A∧@AaI0\@@AAIX~∀@@@AA←S]i∃ef@A¬eJAkMKH@AQ↑AIK9←iJAACeiS
kYCdAaK]⊃S]NA∃mCYk¬iS←]LAS\~(@@@@AKmC1MeC[∀@AC]⊂AeKY¬iKHA⊃KEkO≥S]NA→k]Gi%←]f\4∀~∀~(@@@@4∃a]C5J~∀@@@A)!JAa]¬[JX@↓←dAaIS]h[9C[JX↓←LAC8ACi←5SFAge[E←XASfA∧AgKcUK]GJ↓←L~∀@@@A
QCeC
iKef↓oQSG ACeJ↓isaK⊂AS\A=dA←kPAi↑A⊃K]←i∀AiQCPAgs[ ←X\~(~∀@@@~∀~)aeKI%GCiJ4∀@@@AαAMU]GiS=\@Ao!SGPAQKgifAiQJ↓ieki @A←d↓MCYg%ir@A=LAB@↓aCei%GkYCH~∀@@@AG←9ISiS=\X@AIKike9S]N@↓h@AS_@ASh↓Sf@AQekJA=d@A]%X∩AS_AShA%f~∀@@@AM¬YgJ\4∀~∀~(~∃ae%]YK]≥iP~∀@@@A∧AmCe%CEYJ↓oQSG AGC\↓EJAg∃h@Ai<AiQJ↓[CqS5kZA]U[EKd↓←LACQ←[fA%\AB~(@@@@↓YSghAiQCPAoSY0AEJAAeS]i∃H@AE∃M←eJ↓iQJAAeS]i∃dAoS1X@AO%mJAk@AC]H4∀@@@Aakh@@D@8\\@D@A∨a∃eCiKL@Ak]⊃Kd@AQQJ@@↓G←]iI←X@A=L@@@!ggiCQkf~∀@@@A¬EEeKYSCiJ$@\~∀4∀@@@~∀~∃AeS]Y∃mKX~(@@@@↓αAmCISCEY∀AoQS
PAGC8AEJAMKhAi<AiQJ↓[CqS5kZAI∃aiPA=LA]KMiKHA1Sgif4∀@@@AoQS
P@Ao%YXAE∀AaeS9iKHA KM←e∀@AiQ∀AaeS9iKdA]SYXA≥SmJ@↓k`AC9HAakP~∀@@@@D@@D\∪=aKeCQKf@@↓k]IKH@@Ai!J∩@A
←]ie=X@@A=L∩@@!ggiCQkf~∀@@@A¬EEeKYSCiJ$@\~∀4∀~∀~)ae←N4∀@@@AαAaI←N@A%fAB@↓→∪' ↓M←eZAECg∃HA←\%iQJA→k]Gi%←\@@↓ae←N@AoQ%GP~∀4∀~∃!¬OJAq`∩∩∩∩↓∂Y←gMCer∩@@@@Aβae%X@dl0@brnT~∀_∩∩∩$A∂Y←MgCer@@@~(~∀@@@ACY1←of@↓BAG←9ie←X↓giek
ikeJ↓←L@AMKckK9iSCX↓giCi∃[K]iLAC]H↓O←i←LX~∀@@@Ae¬iQKd↓iQC\↓G←[a=gKHA→k]Gi%←]fX↓i↑AE∀AkgK⊂\~∀@@@~∀4∀~∃aI←NAi¬N~∀@@@Aβ8ACi←4AoQS
PAiC≥fA←d↓YCEK1fABAACeiS
kYCd↓giCi∃[K]h↓S\AB↓ae←N↓g↑~∀@@@AQQChA%hAGC8AEJAIKMKeIKHAi<AoSi AiQJAO↑@↓Mk]GQS←\\4∀~∀~(~∃ae=NAmCISCEY∀~∀@@@AαAYCeSC YJ@A]QSGP↓SfAE=k]HA rABAAe←NvAKCG Aae←≤AG←]QCS]f↓BAYSMh~∀@@@A←_@Aae=NAmCISCEY∃fAoQ%GPACIJ@AE=k]HAQ↑@A]%X@Ao!K\∪i!JAae=NASf4∀@@@AK]i∃eKHA¬]HAG¬\AEJ↓kgKH↓CfAi∃[a←e¬erAm¬eSCE1KfAo%iQS\↓iQJAAe←N\4∀@@@~∀~∀4∃ae←AKeir4∀@@@Aβgg=GSCi∃HAoSQPAKC
PACi=[SF@↓gs[E=XACe∀Aae←AKeiS∃fXAo!SGPA
C\AE∀~∀@@@AC]dA→∪'@@A←E)KGh\%CGPAae←AKeir↓Sf@A9C[KH↓Er@A¬\@@E%]ISG¬i←dXλ~∀@@@AoQ%GPASL@AUkMhAC\↓Ci←[%FAgs5E←XAUgKHAQ↑@Ae∃MKdAQ↑AiQ¬hAae=aKeid\~∀@ Thus we would refer to the " fsubr property" of cond ,
which has the atom fsubr as indicator and is an internal
pointer to the machine code for cond .
property list
The list of indicators and properties kept on the cdr of each
atomic symbol.
quote
A special function which is used to prevent the evaluation of
arguments to other functions. (quote a) evaluates to the
atomic symbol a , while just a evaluates to the value of
a . (quote a) is usually abbreviated 'a .
readtable
A table which specifies the lexical significance of each ascii
character. The readtable is used by the function read to
direct the parsing of input. It can be altered by the user to
implement special extensions to LISP syntax or to allow use of
April 26, 1975 Glossary Page xxi
Maclisp Reference Manual
the read function to lexically analyze languages other than
LISP. There can be more than one readtable; at any given time
the one that is used is the one that is the value of the atom
readtable .
recursion
See recursion!
roman
An obsolete number system supported by some implementations of
MACLISP.
rplaca
Changing the car of a previously-existing cons to something
other than what it was originally created as. All references to
that cons will find that its car has been changed on them. This
operation has hidden dangers and should not be used lightly.
rplacd
Changing the cdr of a previously-existing cons. Similar to
rplaca.
S-expression
Another name for "LISP object."
single character object
An atomic symbol whose pname is a single character is a "single
character object" if the syntax of that character has been set
so that the character reads in as a seperate atomic symbol even
if it is not surrounded by spaces or other delimiters.
slashify
Page xxii Glossary April 26, 1975
Glossary
"Slashifying" a character is preceding it with a slash (/).
This can be done to special characters such as space or
parenthesis to indicate that they should be treated the same as
alphabetic letters and their special meanings should be ignored.
Slashification is the convention by which pnames may contain
these special characters.
sorting
MACLISP includes a generalized sorting facility. An array or a
list of objects can be sorted if a function can be written to
determine, for any pair of such objects, which is the lesser.
See chapter 11.
special array cell
Some MACLISP implementations use "special array cells" as values
of array properties. These cells are communication words which
allow the array to be addressed by both compiled and interpreted
code.
special form
A form which is not evaluated in the usual way. See chapter 3.
stack
"stack" is synonymous with "pdl," q.v.
string
One of the MACLISP data types is the string of characters,
written "foo" .
subr
A subr is a machine language function which takes a fixed number
of evaluated arguments. When an expr is compiled, it becomes a
subr. A number of the builtin functions, such as memq , are
subrs. Occasionally the term subr is used to include all
machine executable functions, fsubrs and lsubrs as well as true
subrs.
April 26, 1975 Glossary Page xxiii
Maclisp Reference Manual
subr object
The value of a subr , fsubr , or lsubr property. In
some implementation dependent way, a subr object tells lisp how
to get to the machine language function given its name (an
atomic symbol with a subr , lsubr , or fsubr
property.)
substitution
One S-expression may be substituted for another within a third
by using the functions subst and sublis . See chapter 4.
switch
A "switch" is an atomic symbol whose value is by convention
either t or nil , representing on and off respectively.
There are a number of switches which affect the operation of the
lisp system.
symbol
See atomic symbol.
syntax
See readtable.
t
An atomic symbol which is used for expressing truth. Like
nil , it is a constant because its value is always itself.
tag
See prog tag, catch tag.
terminal
Page xxiv Glossary April 26, 1975
Glossary
MACLISP is almost always used interactively by a user
communicating with it through a terminal. The phrase "the
terminal" or "the console" is used in this document to mean the
particular terminal which is controlling the computation under
discussion.
time
MACLISP keeps track of two types of time. "time" is elapsed
time in seconds, since some arbitrary event such as the last
time the computer system was started. "runtime" is the number
of microseconds of CPU running time that has been used.
top level
The level of recursion which lisp is at when first entered. The
user at his terminal is in control. Lisp will accept typed-in
forms, evaluate them, and print the results.
trace
A package for debugging LISP programs which allows control to be
seized whenever specified functions are called. Various
operations to be performed, such as displaying of arguments,
examination of specified variables, and temporarily returning
control to the console via a breakpoint. See chapter 15.
truly worthless atom
An atomic symbol which is not referenced by any list structure
other than the currennt obarray, has no value, and has no
properties. In most cases no one would notice if a truly
worthless atom was removed from the environment and recreated
when someone later referred to its pname. Therefore MACLISP
provides the gctwa function which can be used to direct the
garbage collector to remove truly worthless atoms, in the
interests of saving memory.
type
See chapter 2 for a description of the builtin data types in
MACLISP, and a list of predicates for type-checking. Numeric
type-conversions can be done with the functions listed in
April 26, 1975 Glossary Page xxv
Maclisp Reference Manual
section 7.1.3. Other type conversions can be done with a host
of functions listed mostly in chapter 13. The user may
efficiently define new data types simply by defining functions
to manipulate them.
type checking
See section 2.1 for a list of predicates which return t if
their argument is of a specified data type. In the interpreter
most functions automatically check their arguments for correct
type, but in compiled code types are usually assumed tk be
coprect, and if they are not, the internal mechanisms which
support MACLISP may be damaged.
unbound variable
A variable which has no value is called "unboend." Attempting
to evaluate such a variable widl cause an epror.
¬
usEp interrePts
The user interrupt facilIty allh∂of↓BAkg∃`[ga∃GSMSα+⊃β≠,s∂S'|qβS<hQ↓↓↓αβ↔π'pβ∂?;'∪?1↓∧εvF.dλ∩π∨X&N⊗α99∧{{Y
≡~;{D∧≠xpn↑\kλ
mh≠8.N→<H∞⎇_0
εB⊂⊂⊂⊂λ2r9BH4p|P_2P40\82w4[3P⊂∀→|1r@0t that reSponsE to @∧AcgKβ⊃β';&+CKWπ $)↓α↓↓β7∂Iβ∃αβ∪↔3∂K↔⊃↓∧εvFNLTε.∂,,⊗.
∧λ6}fL\7&N⎇`πε∞αq →H⊂86 XrW∀Dλ*yr`2 α interbe@Aif@A¬aJAkMK@AM=` β↔↔∪?I↓∧ε&.≡|¬Y.8V⊂ [0p∩mclh∂GVαβS'↔(ε'
B≥f H ∧ααα∞,V∞b↑M⊗n 0Y.x7w9YP:7P≥42P"[:9<Pλ7s⊂ #ertain "atteftion getp S]≤@α(α↓↓↓β≤¬ε∂⊗≤:F/⊗4λ N5vP 4he tep¬@↔≥l⊗br∧
6.
∞<V∨&≥ybβ%`
∧[|@⊂→2z0t[9SεEβ@
∀~)kk@<hQ↓↓↓αα≠?I∧¬εO∨Mz&N≡≥Dαπ⊗\≡6}w5Dπ&FT
F/⊗β(λN↑;`@⊂~yP⊂:\rr⊂4o deScrabe the
λ direct @1S]@/∞;∃β-#←↔↔p↓β∂?oβ'3↔ ∧ε␈∩λλ]-≥≥~;D∧→]3L>~;sN∀≥z~,=λ~4aQHλλ∧∧≥<q,Dλ≥≠d
9Xp→→pyrD]42P⊂→s34`#iafC@d@A←L↓I`↔:≤εFN}d∧ε≡∞MI⊗v:a∀¬&F≤1PRα∧∧αεf≥m6∞≡T∧ε.f≥]⊗v∞L↑2π&Tεv.<Z7≡OM∀π&hλ∀l\<Xr∧∞≤[|↑]_P≠4yz9H2pqtβA⊂⊂⊂λ⊂:4fYP⊂0@ `¬c@:_εFN}d ↔4_p;
9λλ∞⎇→0↔ both↓aQJA
CYYKβ⊃↓βπv!βC#*β∂π∪d∧V(h ∧ααα≡&*α
\⊗≡F≥lRε@_;Yn\9y(∧¬_p↔@-pi`→K⊂AWdAα∪W'H¬~-e(λ⊃N↓w1z4[w9W A`≤Aβ##∀Q$ααα∧λNλε@1⊂ impleeE9iC@SL¬vrε|d∧l9I∃≥αβ:~4yP⊂~∧i`≥↔¬H∂* ⊂d8x`↔≠x64@3hed
bq @Bαβ .8r_-m<{ ⊂≥t4q`( i`≥εεc@.→<h∞
→(⊂~\β`
A↓xb¬-YtεNw>N'\⎇~ ↔[9P↓!KUG
4⊂ ↓↓α↓β@&λTαπ→<[$∧]=0↔α" Note QQCH↓aQJ@α3@.v>M⊗}pα"≤nz0`∀upεAkkαs#'h
|e∀β"@∧∧λλ⊃Xu⊂!2H⊂:y`%d to`reAk p Q∩β→β&≥m6∞y+0∂r examphe s@<A`∪#∂!β@',≤&NvqQ"αα∧∧εN∂∀∧ε⊗*∧
.p¬d∞@@A_∧@.Nα4w3Bz4"Pλ8εa@%%CE@3(@⊗v@⎇=0↔Bw0∂n4A@≠≥DH↓Hλλ∧∧≤≤Y.l8π:9H8∧he h S@:¬<⊗ <αP &↓I←RA¬∃S]N↓∧G>_8[
≡x⊃ 2λ4p∞ @QQJAεK@↔∨@λ
↓0qbWαA
λ∧@@@⊂∀U≤v*εα≡≥M⊂ ∧D@⊃t7`∪∪arq April 26, 1 ∩nT∩∀_∩∩∩$A∂Y←MgCer@@@~(~∃mC1kBAG∃YP~∀@@@AQQJ@AYCYkJ↓GKYX↓Sf@AQQChAACehA=H@AC8ACi←5SFAge[E←XAS\A]QSGP↓Sif~(@@@@↓mCYk∀ASf@↓WKah8@A∪\↓c←[J↓S[aY∃[KMi¬iS←]LAiQJAmCYUJAGK1XASf↓WKah4∀@@@A←\A∧@AmC1kJ@AAe←aKIirXA kh@A%\A←i!KefA%hASf↓WKah↓S\ABEQSI⊃K\D~(@@@@↓GKYX↓oQSG @ASf↓Cgg←
SCiK⊂∪oSi @AiQ∀ACi←5SF@AMs[E←0AC]HASf@↓]←h~(@@@@↓CGGKMgSEY∀AKqG∃ahAi<AgKh↓←dAO∃hAiQ∀Ags[ ←XOf↓mCYk∀\~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∃βaISX@dXX@br\j∩∩∩A∂Y←MgCer$∩@@AACOJAaqmSR4∀_~∃∪9ISGKL@\@\\@\@8@\@\\@\@8@\@\\@\@8A'←kIGJtA5βπ→∪M A≠C9kCX@@f↑`l<nl~∀4∃
k]
iS←\↓∪]IK`\@\@8@\@\\@\@8@\@\\@\@8@\@\\@\@8@\@\\@\@8@\@\]∪∩]$∩@@@4∃βi←4A∪]I∃p\@\\@\@8@\@\\@\@8@\@\\@\@8@\@\\@\@8@\@\\@\@8@\@\↓∪∩]∪$∩@@~)π←]G∃ahA∪9IKp@8@\@\\@\@8@\@\\@\@8@\@\\@\@8@\@\\@\@8@\@\\@]∪$]∪∪∩$@~∀~(∩∩@A%∩]∩∩A
k]
iS←\↓∪]IK`~∀~∀4∀T\@8@\@\\@\@8@\@\\@\@8@\@\dZnhA→'+ $@`A=dA[←IJACe≥f~∀T⊂@\@\\@\@8@\@\\@\@8@\@\\@dZ\h@A→M+¬$@@A←dA5←eJA¬eOf~(UCee¬r@\@8@\@\\@\@8@\@\\@\@HZrh@↓→'+¬H@fA←HA[←e∀ACeOL~∀UI%L@\@8@\@\\@\@8@\@\\@\@8@dZnH@A'+ $@dA¬eOf~(UMk]
iS←\8@\@\\@\@8@\@\\@\@HZr@@↓
'+¬H~∀UcU↑@\@8@\@\\@\@8@\@\\@\@8@dZnL@A'+ $@dA¬eOf~(UeKCIeCr@8@\@\\@\@8@\@\\@\@HZrj@↓→'+¬H@bA←HA[←e∀ACeOL~∀V\\@\@8@\@\\@\@8@\@\\@\@8@dZnP@A→'U¬$@`↓←dA[=eJACIOf~∀,H@\@8@\@\\@\@8@\@\\@\@8@\@d4nn@A1'+¬$`A←d↓[←eJ↓CeOf4∀Z\@8@\@\\@\@8@\@\\@\@8@\@\dZnhA→'+ $@`A=dA[←IJACe≥f~∀Z⊂@\@\\@\@8@\@\\@\@8@\@\\@dZ\n@A→M+¬$@@A←dA5←eJA¬eOf~(↑\@\\@\@8@\@\\@\@8@\@\\@\@HZnj@↓→'+¬H@`A←HA[←e∀ACeOL~∀↑H\@\@8@\@\\@\@8@\@\\@\@8@dZn`@A→'U¬$@`↓←dA[=eJACIOf~∀DV@\@8@\@\\@\@8@\@\\@\@8@\@d4nb@AM+¬$@DACeN4∀bVH8@\@\\@\@8@\@\\@\@8@\@\dZnpA'+¬H@bACIN~∀b4@\@\X@\@8@\@\\@\@8@\@\X@dZ\j@A'U¬$@b↓CeN~(bZH\X@\@8@\@\\@\@8@\@\\@\@HZnp@↓'+¬$bACe . . , . . . . , . . . . 2-69 SUBR 1 are
add1 . , & . . . , . . . . , 2-\d@AπU¬$@b↓CeN~)CYaQ¬YKgg@@\@\\@\@8@\@\X@\@HZjl@↓'#¬$α↓Iβπ⊗;L4+∞s⊃9↓r↓1↓9αq↓9↓p↓!↓→αq↓9↓r↓ ∩β%R3"αλj5,∃!Q&∂πYf"αd¬bαr¬dα`$HD¬HH¬dHEV.(λ Jq0TDελ≠tD
9pY$<Y|aQX<≤
O+HD¬HH¬DHD¬HH¬DHDεK-`∧∧∪∀u(
Hλ@
}Hλh≡Yxc!<YkD¬HH¬DHD¬HH¬DHD¬HHε%,,H∧
u0TDε(_<Lq"X<L↑hH¬∧HD¬HH¬DHD¬HH¬∧K ≠P⊂&)Ua)⊂_H7y⊂→λ0y3yCE0y9_|W⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ→⊗\Zλ⊂#)jP)αE \90|qXv6↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂→εLX⊂⊂#∀ha)εB0q10↑r4vyK⊂↔⊂↔λ↔⊂↔⊂↔⊂↔λ↔⊂↔⊂⊗\ZPλ)ja)λ_P0y→FE0yXttW⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂→⊗L
P⊂)jP)⊂_@_y3FE_yywqK⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂→Y≤⊂⊂∀ja)⊂⊂0y3\FE0y\xP↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂→⊗Y∞P⊂)jP)⊂→⊂_y3yFB0z0wλ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊗\_⊂λ)ja)λ→⊂0y→yFE0]7vP↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂→⊗LP⊂⊂)Ua)⊂_H0y3FB10sxλ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊗XP⊂λ)ja)λ_P0y→FE17[v2W⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂→⊗L⊂⊂&)Ua)⊂→H7y⊂6[y2P0\3yFE_7zw2≤⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂→ZXP⊂∀ja)⊂P0y3CE1ppXpy⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ→⊗X[λ⊂)ja∀⊂_P0\3FEεBεE&p\1t⊂→K⊂_\[M∧DP⊂λ$dW$H⊂⊂#:[1z4w[⊂$w2→|∧DDH(0srH4FEβ∧DDPλ⊂⊂&pXv4yxλ)2s2\2w1rH&pw:XvεEεBεEεEβE1ppXr9⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ→⊗X[λ⊂)ja∀⊂_P0\3FE1_ppy↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂→εL[⊂⊂)Ua)⊂_H0y3FB1ppr_y⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊗X[⊂λ)ja)λ_P0y→FE1pXr29⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂→⊗HM⊂⊂)jP)⊂_@_y3FE_ppr9⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂→X[⊂⊂∀ja)⊂P0y3CE1pp\⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ→⊗X[λ⊂)ja∀⊂_P \3FE1Xr0pyλ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂→εLY⊂⊂)Ua)⊂_H0y3FB1pr0Y9⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊗X[⊂λ)ja)λ_P0y→FE1pY0y↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂→⊗HM⊂⊂)jP)⊂_P_y3FE_pr20\⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂→X[⊂⊂∀ja)⊂P0q3CE1pr→29⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ→⊗X[λ⊂)ja∀⊂_P !rg
ca`db∞ . . , . . . . . . . . 2
12 SUBR 1 arg
cadr . . ( . . . . , . . . . 2-16 SUBR 1 are
car. ., . . . . , . . . . , 2-Dj@A'U¬$@bαβπK≤hS∂πS≡A9↓9αq↓9↓r↓1↓9αq↓9↓r↓9↓9β⊃5AQαα~NV∃⊂4+∂∂#↔;π&)↓9↓r↓1↓9αq↓9↓r↓1↓9αq↓I5CI↓α2≥*αI↓αβ?Iβn{K∃β∂∪↔L4T≠∪ππ∂⊃↓9↓r↓0∩αd¬bαr¬dαrαd¬bαrε &⊗Hλ∀jXTH$<Yc!,y_8,NHH¬@⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊗X[⊂λ)ja)λ_P0y→FE1r_py↔ , . . . .(∧@\@8@\@\P ↓Ihε∪ $λ∀u(*H ⊂_y3FE_p0r0\⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂→X[⊂⊂∀ja)⊂P0y3CE1r0Y29⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ→⊗X[λ⊂)ja∀⊂_P !rg
Cdadr∞ . . . . . . . , . . . 2-12 SUBR 1 arg
cdar . . , . . . . . . . . . 2-16 SUBR 1 arg
cddaar. . . . . , . . . . . 2-⊃6 SUBR 1 arg
cddadr . . . . . . . . . . . 2-16 SUBR 1 arg
cddar. . . . , . . . . . . . 2-16 SUBR 1 Arg
cdddar . . . . . . . . . . . 2
16 SUBR 1 arg
cddddr . . . . . . . . . . . 2-16 SUBR 1 arg
cdddr. . . . . . . . . . . . 2-16 SUBR 1 arg
cddr . . . . . . . . . . . . 2-16 SUBR 1 arg
cdr. . . . . . . . . . . . . 2-16 SUBR 1 arg
comment. . . . . . . . . . . 2-10 FSUBR
cond . . . . . . . . . . . . 2-36 FSUBR
cons . . . . . . . . . . . . 2-16 SUBR 2 args
copysymbol . . . . . . . . . 2-59 SUBR 2 args
cos. . . . . . . . . . . . . 2-80 SUBR 1 arg
cxr. . . . . . . . . . . . . 2-34 SUBR 2 args
defprop. . . . . . . . . . . 2-55 FSUBR
defun. . . . . . . . . . . . 2-61 FSUBR
delete . . . . . . . . . . . 2-26 LSUBR 2 or 3 args
Page ii II.I Function Index March 3, 1976
II.I Function Index
delq . . . . . . . . . . . . 2-27 LSUBR 2 or 3 args
difference . . . . . . . . . 2-71 LSUBR 1 or more args
do . . . . . . . . . . . . . 2-39 FSUBR
dumparrays . . . . . . . . . 2-97 SUBR 2 args
eq . . . . . . . . . . . . . 2-3 SUBR 2 args
equal. . . . . . . . . . . . 2-3 SUBR 2 args
err. . . . . . . . . . . . . 2-47 FSUBR
error. . . . . . . . . . . . 2-46 LSUBR 0 to 3 args
errset . . . . . . . . . . . 2-46 FSUBR
eval . . . . . . . . . . . . 2-7 LSUBR 1 or 2 args
exp. . . . . . . . . . . . . 2-79 SUBR 1 arg
explode. . . . . . . . . . . 2-87 SUBR 1 arg
explodec . . . . . . . . . . 2-87 SUBR 1 arg
exploden . . . . . . . . . . 2-87 SUBR 1 arg
expt . . . . . . . . . . . . 2-72 SUBR 2 args
fillarray. . . . . . . . . . 2-96 SUBR 2 args
fix. . . . . . . . . . . . . 2-69 SUBR 1 arg
fixp . . . . . . . . . . . . 2-1 SUBR 1 arg
flatc. . . . . . . . . . . . 2-88 SUBR 1 arg
fhatsize . . . . . . . . . . 2-87 SUBR 1 arg
float. . . . . . . . . . . . 2-69 SUBR 1 arg
floatp . . . . . . . . . . . 2-1 SUBR 1 arg
fsc. . . . . . . . . . . . . 2-84 SUBR 2 args
funcall. . . . . . . . . . . 2-13 LSUBR 1 or more args
function . . . . . . . . . . 2-8 FSUBR
gcd. . , . . . . . . . . . . 2-72 SUBR 2 args
gensym . . . . . . , . . . . 2-59 LSUBR 0 or 1 args
gat. , . . . . . . . . . , . 2-53 SUBR 2 args
getchar. . . . . . . . . . , 2-_5 SUBR 2 args
getcharn , . . . . , . . . . 2-86 SUBR 2 ardπf~∃≥KiX@8@\@\X@\@8@\@\\@\@8@\@dαiUM↓¬~V
Iβ⊃βπK?_4+∨/"␈C;∞k∃9↓r↓1↓9αq↓9↓r↓1↓9αq↓I5K↓↓αN,∩I↓E∧∧↔⊗8Q(vzαd¬bαr¬dαbαd¬bαr¬dαbαd¬bαrε &FHλ⊃J:0TC!,|Y8.L<Xλ¬DHD¬H@¬@⊂∪⊂↔λ↔⊂↔⊂⊗[≠Pλ&)ba∀⊂→⊂ /p∧A[←β∪∃βε⊗;L4+F'Cεα.Bbαd¬bαr¬dα`$ HD¬HH¬∧K ≠L⊂⊂!jP)⊂↓ args
λhae@1←]N\X@\@8@\@\X@\@8@\@\dZllA'+¬H@bACIJ~∃QU]V@\P ↓9αq↓9↓r↓1↓9αq↓9↓p↓1↓Ihε3~α J5,∃$εαε␈$ V␈⊗T↔⊗?1Q&G.βZ|¬DHD¬HH¬D HD¬HH¬@⊂↔⊂→Y⊂⊂⊂∀ja)⊂P0a3CE0 fix & . . . , . . . .( . . 2-69 SEBR 1 @¬eN~∃![aY←⊃JT@\P ↓→αq↓9↓p↓ ∩αd¬bαrε 'εHλ∀jXTH$<Yc!↓"C"I\<Xr∧εi'⊗iB"∧∧λ∩2%I(λλλn9Pu
≥{H∩-l→>α!∀λλλ∧∧λ⊂⊂,\(~ ∀ZFEα∧DDPλ⊂⊂&pXv4qhλ)2s %p¬KMεα)α7πw+π04Ph (!Q h↓X∧w2→rgs
intern . . . . . . . . . . . 2-59 SUBR 1 arg
last . . . . . . . . . . . . 2-18 SUBR 1 arg
length . . . . . . . . . . . 2-18 SUBR 1 arg
lessp. . . . . . . . . . . . 2-67 LSUBR 2 or more args
list . . . . . . . . . . . . 2-19 LSUBR 0 or more args
listarray. . . . . . . . . . 2-96 LSUBR 1 or 2 args
listify. . . . . . . . . . . 2-13 SUBR 1 arg
loadarrays . . . . . . . . . 2-97 SUBR 1 arg
log. . . . . . . . . . . . . 2-79 SUBR 1 arg
lsh. . . . . . . . . . . . . 2-83 SUBR 2 args
lsubrcall. . . . . . . . . . 2-14 FSUBR
make←atom. . . . . . . . . . 2-90 SUBR 1 arg
makhunk. . . . . . . . . . . 2-34 SUBR 1 arg
maknam . . . . . . . . . . . 2-86 SUBR 1 arg
maknum . . . . . . . . . . . 2-30 SUBR 1 arg
makunbound . . . . . . . . . 2-51 SUBR 1 arg
map. . . . . . . . . . . . . 2-101 LSUBR 2 or more args
mapatoms . . . . . . . . . . 2-99 LSUBR 1 or 2 args
mapc . . . . . . . . . . . . 2-99 LSUBR 2 or more args
mapcan . . . . . . . . . . . 2-99 LSUBR 2 or more args
mapcar . . . . . . . . . . . 2-99 LSUBR 2 or more args
mapcon . . . . . . . . . . . 2-99 LSUBR 2 or more args
maplist. . . . . . . . . . . 2-99 LSUBR 2 or more args
max. . . . . . . . . . . . . 2-68 LSUBR 1 or more args
member . . . . . . . . . . . 2-25 SUBR 2 args
memq . . . . . . . . . . . . 2-26 SUBR 2 args
min. . . . . . . . . . . . . 2-68 LSUBR 1 or more args
minus. . . . . . . . . . . . 2-70 SUBR 1 arg
minusp . . . . . . . . . . . 2-65 SUBR 1 arg
munkam . . . . . . . . . . . 2-30 SUBR 1 arg
nconc. . . . . . . . . . . . 2-20 LSUBR 0 or more args
ncons. . . . . . . . . . . . 2-17 SUBR 1 arg
not. . . . . . . . . . . . . 2-4 SUBR 1 arg
nreconc. . . . . . . . . . . 2-21 SUBR 2 args
nreverse . . . . . . . . . . 2-21 SUBR 1 arg
null . . . . . . . . . . . . 2-4 SUBR 1 arg
numberp. . . . . . . . . . . 2-2 SUBR 1 arg
oddp . . . . . . . . . . . . 2-65 SUBR 1 arg
or . . . . . . . . . . . . . 2-36 FSUBR
Page iv II.I Function Index March 3, 1976
II.I Function Index
plist. . . . . . . . . . . . 2-55 SUBR 1 arg
plus . . . . . . . . . . . . 2-71 LSUBR 0 or more args
plusp. . . . . . . . . . . . 2-65 SUBR 1 arg
pnget. . . . . . . . . . . . 2-57 SUBR 2 args
pnput. . . . . . . . . . . . 2-57 SUBR 2 args
prog . . . . . . . . . . . . 2-38 FSUBR
prog2. . . . . . . . . . . . 2-10 LSUBR 2 or more args
progn. . . . . . . . . . . . 2-11 LSUBR 1 or more args
progv. . . . . . . . . . . . 2-11 FSUBR
putprop. . . . . . . . . . . 2-54 SUBR 3 args
quote. . . . . . . . . . . . 2-7 FSUBR
quotient . . . . . . . . . . 2-71 LSUBR 1 or more args
random . . . . . . . . . . . 2-81 LSUBR 0 to 2 args
readlist . . . . . . . . . . 2-86 SUBR 1 arg
remainder. . . . . . . . . . 2-72 SUBR 2 args
remob. . . . . . . . . . . . 2-59 SUBR 1 arg
remprop. . . . . . . . . . . 2-55 SUBR 2 args
return . . . . . . . . . . . 2-43 SUBR 1 arg
reverse. . . . . . . . . . . 2-20 SUBR 1 arg
rot. . . . . . . . . . . . . 2-83 SUBR 2 args
rplaca . . . . . . . . . . . 2-23 SUBR 2 args
rplacd . . . . . . . . . . . 2-23 SUBR 2 args
samepnamep . . . . . . . . . 2-56 SUBR 2 args
sassoc . . . . . . . . . . . 2-29 SUBR 3 args
sassq. . . . . . . . . . . . 2-30 SUBR 3 args
set. . . . . . . . . . . . . 2-50 SUBR 2 args
setarg . . . . . . . . . . . 2-12 SUBR 2 args
setplist . . . . . . . . . . 2-55 SUBR 2 args
setq . . . . . . . . . . . . 2-49 FSUBR
signp. . . . . . . . . . . . 2-66 FSUBR
sin. . . . . . . . . . . . . 2-80 SUBR 1 arg
sort . . . . . . . . . . . . 2-31 SUBR 2 args
sortcar. . . . . . . . . . . 2-32 SUBR 2 args
sqrt . . . . . . . . . . . . 2-79 SUBR 1 arg
store. . . . . . . . . . . . 2-95 FSUBR
stringlength . . . . . . . . 2-89 SUBR 1 arg
stringp. . . . . . . . . . . 2-2 SUBR 1 arg
sub1 . . . . . . . . . . . . 2-72 SUBR 1 arg
sublis . . . . . . . . . . . 2-24 SUBR 2 args
subrcall . . . . . . . . . . 2-13 FSUBR
March 3, 1976 II.I Function Index Page v
Maclisp Reference Manual
subrp. . . . . . . . . . . . 2-2 SUBR 1 arg
subst. . . . . . . . . . . . 2-24 SUBR 3 args
substr . . . . . . . . . . . 2-90 LSUBR 2 or 3 args
sxhash . . . . . . . . . . . 2-27 SUBR 1 arg
symbolp. . . . . . . . . . . 2-1 SUBR 1 arg
symeval. . . . . . . . . . . 2-50 SUBR 1 arg
sysp . . . . . . . . . . . . 2-63 SUBR 1 arg
throw. . . . . . . . . . . . 2-45 FSUBR
times. . . . . . . . . . . . 2-71 LSUBR 0 or more args
typep. . . . . . . . . . . . 2-2 SUBR 1 arg
xcons. . . . . , . . . . . . 2-17 SUBR 2 args
zerop. , . . . . . . . . . . 2-65 SUBR 1 arg
\. . . . . . . . . . . . . . 2-75 SUBR 2 args
\\ . . . . . . . . . . . . . 2-75 SUBR 2 args
↑. . . . . . . . . . . . . . 2-76 SUBR 2 args
↑$ . . . . . . . . . . . . . 2-78 SUBR 2 args
Page vi II.I Function Index March 3, 1976
Maclisp Reference Manual
II.II Atom Index
array. . . . . . . . . . . . 2-2
bignum . . . . . . . . . . . 2-2
car. . . . . . . . . . . . . 2-15
cdr. . . . . . . . . . . . . 2-15
defun. . . . . . . . . . . . 2-61
fixnum . . . . . . . . . . . 2-2
flonum . . . . . . . . . . . 2-2
funarg . . . . . . . . . . . 2-9
hunkp. . . . . . . . . . . . 2-34
list . . . . . . . . . . . . 2-2
nil. . . . . . . . . . . . . 1-10
random . . . . . . . . . . . 2-2
string . . . . . . . . . . . 2-2
symbol . . . . . . . . . . . 2-2
zunderflow . . . . . . . . . 2-81
Page vii II.II Atom Index March 3, 1976
Maclisp Reference Manual
II.III Concept Index
application. . . . . . . . . 1-17 lambda . . . . . . . . . . . 1-17
argument . . . . . . . . . . 1-15 lambda variable. . . . . . . 1-17
arithmetic . . . . . . . . . 2-71 lexpr. . . . . . . . . . . . 1-16
array. . . . . . . . . . . . 1-9 list . . . . . . . . . . . . 1-10
association list . . . . . . 2-25 looping. . . . . . . . . . . 2-35
atom . . . . . . . . . . . . 1-7 lsubr. . . . . . . . . . . . 1-15
atomic symbol. . . . . . . . 1-8 macro. . . . . . . . . . . . 1-16
bignum . . . . . . . . . . . 1-7 mapping. . . . . . . . . . . 2-99
binding. . . . . . . . . . . 1-13 mathematical functions . . . 2-79
binding context pointer. . . 1-24 nil. . . . . . . . . . . . . 1-8
boolean operations . . . . . 2-82 non-local exit . . . . . . . 2-35
car. . . . . . . . . . . . . 1-9 number . . . . . . . . . . . 1-7
cdr. . . . . . . . . . . . . 1-9 obarray. . . . . . . . . . . 2-58
character manipulation . . . 2-85 object . . . . . . . . . . . 1-7
character object . . . . . . 1-8 pname. . . . . . . . . . . . 2-56
comment. . . . . . . . . . . 2-10 predicate. . . . . . . . . . 2-1
cons . . . . . . . . . . . . 1-9 property . . . . . . . . . . 2-52
defining functions . . . . . 2-61 property list. . . . . . . . 2-52
dot. . . . . . . . . . . . . 1-10 quote. . . . . . . . . . . . 2-7
dotted pair. . . . . . . . . 1-10 recursion. . . . . . . . . . 2-35
eq versus equal. . . . . . . 2-3 S-expression . . . . . . . . 1-7
errors . . . . . . . . . . . 2-35 sorting. . . . . . . . . . . 2-31
evaluation . . . . . . . . . 1-15 special forms. . . . . . . . 1-21
expr . . . . . . . . . . . . 1-15 string . . . . . . . . . . . 1-9
fexpr. . . . . . . . . . . . 1-15 subr . . . . . . . . . . . . 1-15
fixnum . . . . . . . . . . . 1-7 subr-object. . . . . . . . . 1-9
flonum . . . . . . . . . . . 1-7 substitution . . . . . . . . 2-23
flow of control. . . . . . . 2-35 symbol . . . . . . . . . . . 1-8
form . . . . . . . . . . . . 1-15 t. . . . . . . . . . . . . . 1-8
fsubr. . . . . . . . . . . . 1-15 value cell . . . . . . . . . 2-49
funarg . . . . . . . . . . . 1-20
funarg problem . . . . . . . 2-8
function . . . . . . . . . . 1-15
functional property. . . . . 1-17
gensym . . . . . . . . . . . 2-59
hash table . . . . . . . . . 2-25
indicator. . . . . . . . . . 2-52
intern . . . . . . . . . . . 2-58
iteration. . . . . . . . . . 2-35
label. . . . . . . . . . . . 1-20
Page viii II.III Concept Index March 3, 1976